Registrer MappingJackson2HttpMessageConverter in Spring 3.1.2 mit JAXB-Annotationen

Ich habe eine Reihe von Entities mit JAXB-Annotationen, die ich mit einem Message-Converter in JSON konvertieren möchte.

Ich weiß, dass mein ObjectMapper, der die JAXB-Anmerkungen liest, funktioniert:

String correctJsonText = jacksonObjectMapper.writeValueAsString(entityWithJAXB); 

Aber wenn ich meinen Rest-Service anrufe, scheint der standardmäßig registrierte MappingJacksonHttpMessageConverter (der nicht zum Lesen von JAXB konfiguriert ist) zu übernehmen - was zu einem Stapelüberlauf aufgrund von zyklischen Referenzen führt, wenn @XmlTransient ignoriert wird ...

Wie konfiguriere ich Spring für die Verwendung von MappingJackson2HttpMessageConverter?

Aktuelle Konfiguration

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

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

Abhängigkeiten

<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 / Lösung

Durch Debuggen meines Kontexts konnte ich feststellen, dass die Konfiguration in<mvc:annotation-driven> hatte keine Wirkung.

Es stellte sich heraus, dass mein Unit-Test mit MockMcv immer die Standard-Handleradapter geladen hat, wodurch mein benutzerdefinierter Objectmapper ignoriert wurde. Aus Bequemlichkeitsgründen habe ich den Controller nur mit dem Junit-Test getestet, da er den Controller ganz gut getroffen hat, habe ich dies nicht als wahrscheinliche Fehlerursache angesehen ...

Ich habe noch keinen Fix für meinen Test gefunden, aber wenn ich den Service mit curl anrufe, funktioniert alles!

UPDATE / Endlösung

Habe gerade eine Lösung für meinen Testaufbau gefunden; Wenn Sie MockMvc (Spring-Test-Mvc) verwenden, müssen Sie benutzerdefinierte Nachrichtenkonverter explizit angeben:

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

Das einzige verbleibende Problem ist, dass diejacksonMessageConverter kann nicht direkt automatisch verkabelt werden, bis das folgende JIRA behoben ist:https://jira.springsource.org/browse/SPR-9469. Bis dahin habe ich gerade eine Kopie des jacksonMessageConverter in meinem Testkontext erstellt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage