Mapeador de registradorJackson2HttpMessageConverter no Spring 3.1.2 com anotações JAXB

Eu tenho um número de entidades com anotações JAXB que eu gostaria de converter para JSON usando um conversor de mensagens.

Eu sei que meu ObjectMapper que lê as anotações JAXB funciona:

String correctJsonText = jacksonObjectMapper.writeValueAsString(entityWithJAXB); 

Mas quando eu chamo meu serviço de descanso, o MappingJacksonHttpMessageConverter registrado padrão (que não está configurado para a leitura de JAXB) parece assumir o controle - resultando em um stackoverflow devido a referências cíclicas quando o @XmlTransient é ignorado ...

Como configuro o Spring para usar o MappingJackson2HttpMessageConverter?

Configuração atual

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

Serviço 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);
}

Dependências

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

ATUALIZAÇÃO / SOLUÇÃO

Ao depurar meu contexto, pude ver que a configuração em<mvc:annotation-driven> não teve efeito.

Descobri que meu teste de unidade com o MockMcv sempre carregava os adaptadores de handler padrão, ignorando, assim, meu mapeador de objeto personalizado. Devido a conveniência eu só testei o controlador usando o teste junit, já que ele acertou bem no controlador eu não pensei nisso como uma causa provável de erro ...

Eu não encontrei uma correção para o meu teste ainda, mas quando eu chamo o serviço usando o curl tudo funciona!

ATUALIZAÇÃO / solução final

Acabei de encontrar uma solução para a minha configuração de teste; Ao usar o MockMvc (spring-test-mvc) você deve especificar conversores de mensagens customizados explícitos:

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

A única questão que permanece é que ojacksonMessageConverter não pode ser autowired diretamente até que o seguinte JIRA seja resolvido:https://jira.springsource.org/browse/SPR-9469. Até então, acabei de criar uma cópia do jacksonMessageConverter no meu contexto de teste.

questionAnswers(1)

yourAnswerToTheQuestion