メッセージコンバータを使用してJSONに変換したいJAXBアノテーションを持つエンティティが多数あります。JAXBアノテーション付きSpring 3.1.2の登録者マッピングJackson2HttpMessageConverter
私はJAXB注釈を読み、私のObjectMapperが機能することを知っている:
String correctJsonText = jacksonObjectMapper.writeValueAsString(entityWithJAXB);
しかし、私は私のRESTサービスを呼び出すときにデフォルトが(JAXBを読み取るために構成されていません)MappingJacksonHttpMessageConverterが引き継ぐように思わ登録 - になります@XmlTransientが無視されるときの循環参照によるスタックオーバーフロー...
MappingJackson2HttpMessageConverterを使用するためにSpringを設定するにはどうすればよいですか?
現在の設定
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper" />
<property name="supportedMediaTypes">
<list>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="application" />
<constructor-arg index="1" value="json" />
<constructor-arg index="2" value="UTF-8" />
</bean>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="jaxbAnnotationInspector" class="com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector" />
<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="annotationIntrospector" ref="jaxbAnnotationInspector" />
</bean>
RESTサービス
@RequestMapping(value="/{id}", method=RequestMethod.GET, produces = "application/json;charset=UTF-8")
public @ResponseBody EntityWithJAXB readEntityWithJAXB(@PathVariable int id, Model model) {
return entityService.getById(id);
}
依存
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.0.5</version>
</dependency>
UPDATE/Solution
コンテキストをデバッグすると、<mvc:annotation-driven>
の設定が無効になっていることがわかりました。
MockMcvでの私の単体テストは、常にデフォルトのhandleradaptersをロードしていたので、私のカスタムオブジェクトマッパーは無視されていました。便宜のためにコントローラをテストしたのはjunitテストだけでした。コントローラが正常に機能していたため、このエラーが発生する可能性は低いと思いました...
私のテストの修正はまだ見つかりませんでした。私はカールを使用してサービスを呼び出すすべての作品!
UPDATE /最終溶液
はちょうど私のテスト・セットアップのための解決策を見つけました。
private MockMvc mockMvc;
@Autowired
private MappingJackson2HttpMessageConverter jacksonMessageConverter;
@Autowired
private RestController restController;
@Before
public void initMockMvc(){
mockMvc = MockMvcBuilders.standaloneSetup(restController)
.setMessageConverters(jacksonMessageConverter).build();
}
@Test
public void testRestController() throws Exception{
DefaultRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/json/42");
this.mockMvc.perform(requestBuilder).andDo(print()).andExpect(status().isOk());
}
ザ・唯一残っている問題は、次のJIRAが解決されるまでjacksonMessageConverter
が直接autowiredすることができないということです:https://jira.springsource.org/browse/SPR-9469明示的なカスタムメッセージ・コンバータを指定する必要がありますMockMvc(春・テスト-MVC)を使用した場合。それまでは、テストコンテキストでjacksonMessageConverterのコピーを作成しました。
ありがとう、それは貴重な情報です!私の@Xmlアノテーションはゲッターとセッターに代わっていますが、私はこれが何か違いを生むべきだとは思わない。それは私の設定の中で他のものがあるかもしれないが、それを上手くやってしまうかもしれない。私はジャッキンの設定をきれいなプロジェクトに移して、それが私にとってうまくいくかどうかを調べるだろう。見つけたら解決策を投稿します。 – molholm
私はあなたと同じようにクリーンなプロジェクトで構成作業を行いました。問題はありません。私は、WebServiceMessageReceiverHandlerAdapterによってディスパッチ・サーブレットがデフォルト・アダプターまたはその他の構成上の問題をロードしないようにする問題が原因だと思っていましたが、そうではありませんでした。 – molholm
元の投稿をソリューションで更新しました。ありがとう! – molholm