65

post メソッドで新しいオブジェクトを投稿しようとすると。RequestBody が contentType を認識できませんでした。Spring はすでに構成されており、POST は他のオブジェクトで機能しますが、この特定のオブジェクトでは機能しません。

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

同じリクエストを試してみると、requestbody オブジェクトを変更するだけです。できます。

4

16 に答える 16

85

解決策を見つけました。同じ名前で種類の違うセッターを2つ持っていたからです。

私のクラスには、オブジェクトを休止状態にするときに Integer に置き換えたidプロパティ int がありました。

しかし、どうやら、セッターを削除するのを忘れていたので、次のことがありました。

/**
 * @param id
 *            the id to set
 */
public void setId(int id) {
    this.id = id;
}

/**
 * @param id
 *            the id to set
 */
public void setId(Integer id) {
    this.id = id;
}

このセッターを削除すると、残りのリクエストは非常にうまく機能します。

非整列化エラーをスローするか、クラス エラーを反映する代わりに。例外 HttpMediaTypeNotSupportedException は、ここでは非常に奇妙です。

このスタックオーバーフローが他の人の助けになることを願っています。

サイドノート

Spring サーバーコンソールで次のエラー メッセージを確認できます。

タイプ [単純なタイプ、クラス your.package.ClassName] の Jackson デシリアライゼーションを評価できませんでした: com.fasterxml.jackson.databind.JsonMappingException: プロパティ "propertyname" のセッター定義が競合しています

次に、上記の問題に対処していることを確認できます。

于 2013-10-18T08:22:01.880 に答える
8

POST で送信されないパラメーターの属性に対してゲッターとセッターを宣言した場合 (コンストラクターで宣言されていない場合のイベント) にも注意してください。次に例を示します。

@RestController
public class TestController {

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public String test(@RequestBody BeanTest beanTest) {
        return "Hello " + beanTest.getName();
    }


    public static class BeanTest {

        private Long id;
        private String name;

        public BeanTest() {
        }

        public BeanTest(Long id) {
            this.id = id;
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

次の構造を持つポスト リクエスト: {"id":"1"} は機能しません。名前の get と set を削除する必要があります。

于 2015-12-22T14:06:21.030 に答える
4

本当!4 時間かけて非常識なデバッグを行った後、com.fasterxml.jackson.databind.deser.DeserializerCache でこの非常に奇妙なコードを見つけました。

if (deser == null) {
    try {
        deser = _createAndCacheValueDeserializer(ctxt, factory, type);
    } catch (Exception e) {
        return false;
    }
}

そう、問題はダブルセッターでした。

于 2014-09-24T08:13:53.580 に答える
2

私の場合、Bean に 2 つのコンストラクターがあり、同じエラーが発生しました。それらの1つを削除したところ、問題は修正されました!

于 2016-06-21T12:06:54.630 に答える
2

Enum と 1 つの String を持つ 2 つのセッターがある場合、同じ問題が発生しました。@JsonSetter アノテーションを使用して、シリアル化中に使用するセッター メソッドを Jackson に伝える必要がありました。これで私の問題は解決しました。

于 2016-04-07T21:47:52.057 に答える
2

投稿された値を逆シリアル化することで解決した同じ問題に遭遇しました:

@RequestMapping(value = "/arduinos/commands/{idArduino}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String sendCommandesJson(@PathVariable("idArduino") String idArduino, HttpServletRequest request) throws IOException {
    // getting the posted value
    String body = CharStreams.toString(request.getReader());
    List<ArduinoCommand> commandes = new ObjectMapper().readValue(body, new TypeReference<List<ArduinoCommand>>() {
    });

これらのgradle依存関係で:

  compile('org.springframework.boot:spring-boot-starter-web')
  compile('com.google.guava:guava:16.0.1')
于 2016-06-16T12:10:10.217 に答える
1

そのため、オーバーロードされたコンストラクターを持つ Bean があるという同様の問題がありました。この Bean にはオプションのプロパティもありました。

それを解決するために、オーバーロードされたコンストラクターを削除しただけで機能しました。

例:

public class Bean{

Optional<String> string;
Optional<AnotherClass> object;

public Bean(Optional<String> str, Optional<AnotherClass> obj){
string = str;
object = obj;
}

///The problem was below constructor

public Bean(Optional<String> str){
string = str;
object = Optional.empty();
}



}

}
于 2016-10-20T21:55:33.757 に答える
1

古いスレッドのように見えますが、誰かがまだ苦労している場合に備えて、ティボーが言ったように解決しました。

2 つのセッター POJO クラスを使用しないでください。特定のプロパティに対して 2 つのセッターがありました。最初のセッターは通常のセッターにあり、もう 1 つはコンストラクター内の 1 つを削除した後、コンストラクターの下にありました。

于 2018-04-10T14:32:51.777 に答える
1

同じプロパティに対して 2 つのゲッターがある場合、デシリアライザーは失敗しますリンクを参照

于 2021-01-27T06:45:33.027 に答える