微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring 3.1.2中带有JAXB批注的注册器MappingJackson2HttpMessageConverter

如何解决Spring 3.1.2中带有JAXB批注的注册器MappingJackson2HttpMessageConverter

我复制了您的配置,它非常适合我。认消息转换器不应生效,因为您已经明确指定了register- defaults=false属性。这是我的@XmlTransient批注的外观:

@XmlAccessorType(XmlAccesstype.FIELD)
public class EntityWithJAXB {


    @XmlTransient
    private EntityWithJAXB aChild;

解决方法

我有许多带有JAXB批注的实体,我想使用消息转换器将其转换为JSON。

我知道读取JAXB批注的ObjectMapper可以工作:

String correctJsonText = jacksonObjectMapper.writeValueAsString(entityWithJAXB);

但是当我打电话给我的休息服务时,默认注册的MappingJacksonHttpMessageConverter(未配置为读取JAXB)似乎接管了-
由于@XmlTransient被忽略时由于循环引用而导致堆栈溢出…

如何配置Spring以使用MappingJackson2HttpMessageConverter?

当前配置

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

更新/解决方案

通过调试上下文,我可以看到其中的配置<mvc:annotation-driven>无效。

原来,我使用MockMcv进行的单元测试始终加载默认的handleradapters,因此忽略了我的自定义objectmapper。为了方便起见,我只使用junit
test测试了控制器,因为它恰好击中了控制器,所以我没有将其视为可能的错误原因…

我尚未找到测试的修复程序,但是当我使用curl调用该服务时,一切正常!

更新/最终解决方案

刚刚为我的测试设置找到了解决方案;使用MockMvc(spring-test-mvc)时,必须显式指定自定义消息转换器:

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

唯一剩下的问题是,在jacksonMessageConverter解决以下JIRA问题之前,不能直接自动接线:https
:
//jira.springsource.org/browse/SPR-9469。在此之前,我只是在测试上下文中创建了jacksonMessageConverter的副本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。