4

Spring rest アプリケーションが xml と json の両方の応答を処理できるようにしようとしていますが、Jaxb メッセージ コンバーターを追加すると json マッピングが壊れてしまったようです。

@Bean
public MappingJackson2HttpMessageConverter jsonConverter() {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(String.class, new StringSerializer());
    ObjectMapper mapper = new ObjectMapper()
        .registerModule(simpleModule);
    converter.setObjectMapper(mapper);
    return converter;
}

@Bean
public Jaxb2RootElementHttpMessageConverter jaxbConverter() {
    return new Jaxb2RootElementHttpMessageConverter();
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(jsonConverter());
    converters.add(jaxbConverter());
}

そこで 2 番目と 3 番目のメソッドをコメントアウトすると、すべてが再び機能し始めます (もちろん xml マッピングを除く!)。しかし、そこにあると、リンゴ、オレンジ、バナナがリスト内の別々の文字列である でList<String>結果をシリアル化するなど、めちゃくちゃになります。[APPLEORANGEBANANA]

ジャクソンオブジェクトマッパーを直接使用してjsonにマップする場合、その問題はありませんが、@ResponseBody注釈を使用してjsonに自動的にシリアル化すると、この問題が発生します。

誰にもアイデアはありますか?

4

4 に答える 4

0

を削除するconfigureMessageConvertersと、両方のコンバーターが自動的に検出されましたが、どちらにも問題はありません。

于 2013-09-06T06:17:03.223 に答える
0

私にもまったく同じことが起こりました。2回:-)

あるケースでは、コンバーターを追加する前に簡単converters.clear()に問題を解決しました。Spring はデフォルトでいくつかのコンバーターを追加するようです。XML を使用してそれらを注入すると、Spring によって暗黙的に設定されたものは削除されますが、コードから明示的に追加することはできません。

他の場合の問題は、リクエストに正しいヘッダーが設定されていたことでした。つまり、content-typeandacceptです。次に、リクエスト マッピングで、「consumes」パラメータと「produces」パラメータを指定して、2 つのヘッダーをそれぞれマッピングする必要がありました。

public class MyRequestHandler {
     ...

     @RequestMapping(... , consumes={ MediaType.APPLICATION_JSON_VALUE, produces = { MediaType.APPLICATION_JSON_VALUE } }
     public ResponseEntity<MyResultClass> doSomething(...) { ... }

     ...
}

これで問題は解決しました。

于 2015-09-24T10:39:38.387 に答える
0

configureMessageConverters をオーバーライドすると、デフォルトのメッセージ コンバーターは追加されません。以下のコードを試してください。

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(jsonConverter());
    converters.add(jaxbConverter());
    super.addDefaultHttpMessageConverters();
}
于 2019-05-16T07:50:21.867 に答える