2012-09-20 6 views
8

メッセージコンバータを使用して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のコピーを作成しました。

答えて

3

私は設定を複製してくれました。 register-defaults=false属性を明示的に指定しているので、デフォルトのメッセージコンバータは有効ではありません。これは、私の@XmlTransient注釈がどのように表示されるかです。

@XmlAccessorType(XmlAccessType.FIELD) 
public class EntityWithJAXB { 


    @XmlTransient 
    private EntityWithJAXB aChild; 
+0

ありがとう、それは貴重な情報です!私の@Xmlアノテーションはゲッターとセッターに代わっていますが、私はこれが何か違いを生むべきだとは思わない。それは私の設定の中で他のものがあるかもしれないが、それを上手くやってしまうかもしれない。私はジャッキンの設定をきれいなプロジェクトに移して、それが私にとってうまくいくかどうかを調べるだろう。見つけたら解決策を投稿します。 – molholm

+1

私はあなたと同じようにクリーンなプロジェクトで構成作業を行いました。問題はありません。私は、WebServiceMessageReceiverHandlerAdapterによってディスパッチ・サーブレットがデフォルト・アダプターまたはその他の構成上の問題をロードしないようにする問題が原因だと思っていましたが、そうではありませんでした。 – molholm

+0

元の投稿をソリューションで更新しました。ありがとう! – molholm

関連する問題