JavaオブジェクトのJSON表現を提供するRESTサービスを作成するためにspring-boot-starter-web
を使用しようとしています。私が理解していることから、このboot-starter-web jarはJacksonを介したJSONへの変換を自動的に処理するはずですが、代わりにこのエラーが発生します。
{ "timestamp": 1423693929568,
"status": 406,
"error": "Not Acceptable",
"exception": "org.springframework.web.HttpMediaTypeNotAcceptableException",
"message": "Could not find acceptable representation"
}
私のコントローラーはこれです...
@RestController
@RequestMapping(value = "/media")
public class MediaController {
@RequestMapping(value = "/test", method = RequestMethod.POST)
public @ResponseBody UploadResult test(@RequestParam(value="data") final String data) {
String value = "hello, test with data [" + data + "]";
return new UploadResult(value);
}
@RequestMapping(value = "/test2", method = RequestMethod.POST)
public int test2() {
return 42;
}
@RequestMapping(value = "/test3", method = RequestMethod.POST)
public String test3(@RequestParam(value="data") final String data) {
String value = "hello, test with data [" + data + "]";
UploadResult upload = new UploadResult(value);
return upload.value;
}
public static class UploadResult {
private String value;
public UploadResult(final String value)
{
this.value = value;
}
}
}
私のpom.xml
は...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-Tomcat</artifactId>
<version>1.2.1.RELEASE</version>
<scope>provided</scope>
</dependency>
mvn dependency:tree
は、spring-boot-starter-webが実際にjackson2.4 databindに依存しているため、クラスパスにある必要があることを示しています...
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.2.1.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.2.1.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot:jar:1.2.1.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.2.1.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.2.1.RELEASE:compile
[INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.8:compile
[INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.8:compile
[INFO] | | \- org.yaml:snakeyaml:jar:1.14:runtime
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.4.4:compile
[INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.4.0:compile
[INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.4.4:compile
[INFO] | +- org.hibernate:hibernate-validator:jar:5.1.3.Final:compile
[INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] | | +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile
[INFO] | | \- com.fasterxml:classmate:jar:1.0.0:compile
[INFO] | +- org.springframework:spring-web:jar:4.1.4.RELEASE:compile
[INFO] | | +- org.springframework:spring-aop:jar:4.1.4.RELEASE:compile
[INFO] | | | \- aopalliance:aopalliance:jar:1.0:compile
[INFO] | | +- org.springframework:spring-beans:jar:4.1.4.RELEASE:compile
[INFO] | | \- org.springframework:spring-context:jar:4.1.4.RELEASE:compile
[INFO] | \- org.springframework:spring-webmvc:jar:4.1.4.RELEASE:compile
[INFO] | \- org.springframework:spring-expression:jar:4.1.4.RELEASE:compile
...まだtest
サービスを呼び出すと、上記のエラーが発生します。 test2
およびtest3
は、失敗しているJSONへの変換の試行のみである必要があることを証明して正常に動作しますか?構成の問題や注釈がありませんか?私が見つけたすべての例から、基本的なJackson JSON変換のクラスに注釈を付ける必要はなくなりました。
どんな助けも大歓迎です。
UpdateResultのパブリックゲッターはありません。たとえば:
public static class UploadResult {
private String value;
public UploadResult(final String value)
{
this.value = value;
}
public String getValue() {
return this.value;
}
}
デフォルトでは自動検出がオンになっており、ゲッターを検出しようとすると信じています。 @JsonAutoDetect(getterVisibility=Visibility.NONE)
で無効にすることができ、あなたの例では[]
になります。
spring/jhipster
RESTfulサービス(Postman
経由)を使用して同様のエラーが発生しました
エンドポイントは次のようなものでした:
@RequestMapping(value = "/index-entries/{id}",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<IndexEntry> getIndexEntry(@PathVariable Long id) {
restful
ヘッダーAccept: text/plain
を介してPostman
エンドポイントを呼び出そうとしましたが、Accept: application/json
を使用する必要がありました
私も同様の問題に直面していました。私の場合、要求パスはパス変数としてメールIDを受け入れていたため、uriは/some/api/[email protected]のように見えました
そして、パスに基づいて、Springはuriが ".com"拡張子を持つファイルをフェッチすることであると判断し、応答に異なるメディアタイプを使用しようとしていました。パス変数をリクエストパラメータにした後、それは私のために働いた。
返されるオブジェクトには、クラスに@XmlRootElementアノテーションがありませんでした。注釈を追加すると問題が解決しました。
@XmlRootElement(name = "ReturnObjectClass")
public class ReturnObjectClass {
@XmlElement(name = "Status", required = true)
protected StatusType status;
//...
}
@FeignClientを使用している場合は、たとえば.
produces = "application/json"
@RequestMappingアノテーションへ
私の場合、たまたまロンボクを使用していましたが、どうやらgetとsetに矛盾があります
spring 5では受け入れられた答えは正しくありません。WebサービスのURLを.jsonに変更してみてください!それが正しい修正です。詳細はこちら http://stick2code.blogspot.com/2014/03/solved-orgspringframeworkwebhttpmediaty.html
POMでjsonライブラリの依存関係を明示的に呼び出さなければなりませんでした。
以下の依存関係を追加すると、すべて機能しました。
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
以下の依存関係を追加:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.4.6</version>
</dependency>
同じ例外がありましたが、原因が異なり、その情報が見つからなかったため、ここに投稿します。間違いを見落とすのは簡単でした。
悪い:
@RestController(value = "/api/connection")
良い:
@RestController
@RequestMapping(value = "/api/connection")
デシリアライズするpojoクラスに@Dataアノテーションを追加します。問題は私のために解決されました:)
例えば、
import lombok.Data;
@Data
public class Response {
private Integer status;
private String type;
}