Registrieren MappingJackson2HttpMessageConverter im Frühjahr 3.1.2 mit JAXB-Annotationen

Habe ich eine Reihe von Organisationen, die mit JAXB-Annotationen, die würde ich gerne umwandeln in JSON über eine message-Konverter.

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

String correctJsonText = jacksonObjectMapper.writeValueAsString(entityWithJAXB); 

Aber wenn ich mein rest-service, der standardmäßig eingetragene MappingJacksonHttpMessageConverter (die nicht konfiguriert ist zum Lesen von JAXB) scheint zu übernehmen - was eine stackoverflow durch zyklische Verweise, wenn @XmlTransient ignoriert...

Wie Konfiguriere ich Spring zu verwenden 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 debugging meinen Kontext konnte ich sehen, dass die Konfiguration in <mvc:annotation-driven> hatte keine Wirkung.

Es stellte sich heraus, dass meine unit-test mit MockMcv immer geladen Standard handleradapters, so ignoriert man meine custom objectmapper. Wegen der Bequemlichkeit habe ich nur getestet, den controller mit junit testen, da traf es die controller nur in Ordnung, ich nicht denke, dass dies als eine wahrscheinliche Fehlerursache...

Habe ich nicht gefunden, ein Update für meinen test noch nicht, aber wenn ich den service rufen mit curl funktioniert alles!

UPDATE /Endgültige Lösung

Gerade eine Lösung gefunden für mein test-setup; bei der Verwendung von MockMvc (spring-test-mvc) müssen Sie eine benutzerdefinierte Nachricht-Konverter explizit:

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 die jacksonMessageConverter können nicht autowired direkt bis zum folgenden JIRA ist gelöst: https://jira.springsource.org/browse/SPR-9469. Bis dann, ich habe soeben eine Kopie der jacksonMessageConverter in meinem test-Kontext.

InformationsquelleAutor molholm | 2012-09-20
Schreibe einen Kommentar