Registrer MappingJackson2HttpMessageConverter na wiosnę 3.1.2 z adnotacjami JAXB

Mam wiele encji z adnotacjami JAXB, które chciałbym przekonwertować na JSON za pomocą konwertera komunikatów.

Wiem, że mój ObjectMapper, który odczytuje prace adnotacji JAXB:

String correctJsonText = jacksonObjectMapper.writeValueAsString(entityWithJAXB); 

Ale gdy zadzwonię do mojej usługi odpoczynku, domyślnie zarejestrowany MappingJacksonHttpMessageConverter (który nie jest skonfigurowany do odczytu JAXB) wydaje się przejmować - co skutkuje przepływem stosu z powodu cyklicznych odwołań, gdy @XmlTransient jest ignorowany ...

Jak skonfigurować Springa do korzystania z MappingJackson2HttpMessageConverter?

Aktualna konfiguracja

<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>

Usługa 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);
}

Zależności

<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>

AKTUALIZACJA / Rozwiązanie

Poprzez debugowanie mojego kontekstu widziałem, że konfiguracja jest w<mvc:annotation-driven> nie przyniosło skutku.

Okazało się, że mój test jednostkowy z MockMcv zawsze ładował domyślne handleradapters, ignorując w ten sposób mój niestandardowy program do przetwarzania obiektów. Ze względu na wygodę przetestowałem kontroler tylko za pomocą testu junit, ponieważ trafił on do kontrolera w porządku. Nie uważałem tego za prawdopodobną przyczynę błędu ...

Nie znalazłem jeszcze poprawki do mojego testu, ale kiedy zadzwonię do usługi za pomocą curl, wszystko działa!

AKTUALIZACJA / Ostateczne rozwiązanie

Właśnie znalazłem rozwiązanie dla mojej konfiguracji testowej; podczas korzystania z MockMvc (spring-test-mvc) należy określić niestandardowe konwertery wiadomości:

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());
}

Jedynym pozostałym problemem jest to, żejacksonMessageConverter nie może być automatycznie przypisany, dopóki nie zostanie rozstrzygnięta następująca JIRA:https://jira.springsource.org/browse/SPR-9469. Do tego czasu właśnie stworzyłem kopię jacksonMessageConverter w moim kontekście testowym.

questionAnswers(1)

yourAnswerToTheQuestion