web-dev-qa-db-ja.com

spring-boot-starter-webを使用した「許容可能な表現が見つかりませんでした」

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変換のクラスに注釈を付ける必要はなくなりました。

どんな助けも大歓迎です。

54
crowmagnumb

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)で無効にすることができ、あなたの例では[]になります。

72
ikumen

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を使用する必要がありました

11
wired00

私も同様の問題に直面していました。私の場合、要求パスはパス変数としてメールIDを受け入れていたため、uriは/some/api/[email protected]のように見えました

そして、パスに基づいて、Springはuriが ".com"拡張子を持つファイルをフェッチすることであると判断し、応答に異なるメディアタイプを使用しようとしていました。パス変数をリクエストパラメータにした後、それは私のために働いた。

6
Kranthi Kiran

返されるオブジェクトには、クラスに@XmlRootElementアノテーションがありませんでした。注釈を追加すると問題が解決しました。

@XmlRootElement(name = "ReturnObjectClass")
public class ReturnObjectClass {

    @XmlElement(name = "Status", required = true)
    protected StatusType status;
    //...
}
2
Vasudev

@FeignClientを使用している場合は、たとえば.

produces = "application/json"

@RequestMappingアノテーションへ

2
charlb

私の場合、たまたまロンボクを使用していましたが、どうやらgetとsetに矛盾があります

spring 5では受け入れられた答えは正しくありません。WebサービスのURLを.jsonに変更してみてください!それが正しい修正です。詳細はこちら http://stick2code.blogspot.com/2014/03/solved-orgspringframeworkwebhttpmediaty.html

0
tom

POMでjsonライブラリの依存関係を明示的に呼び出さなければなりませんでした。

以下の依存関係を追加すると、すべて機能しました。

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>
0
thernandez

以下の依存関係を追加:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.4.6</version>
</dependency>
0

同じ例外がありましたが、原因が異なり、その情報が見つからなかったため、ここに投稿します。間違いを見落とすのは簡単でした。

悪い:

@RestController(value = "/api/connection")

良い:

@RestController
@RequestMapping(value = "/api/connection")
0
Dominik H.

デシリアライズするpojoクラスに@Dataアノテーションを追加します。問題は私のために解決されました:)

例えば、

    import lombok.Data;

    @Data
    public class Response {
    private Integer status;
    private String type;
    }
0