SpringMVC与Fastjson整合相当简单,只要在pom引入fastjson包后,配置一下SpringMVC的messageConverter就可以使用了。
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
<mvc:message-converters register-defaults="true">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="mediaTypes" >
<value>
json=application/json
xml=application/xml
</value>
</property>
</bean>
但是如果在单元测试时,使用mockMvc测试controller
private MockMvc mockMvc ;
@Before
public void setUp(){
PersonalController ctrl = this.applicationContext.getBean(PersonalController.class);
mockMvc = MockMvcBuilders.standaloneSetup(ctrl).build();
}
@Test
public void testGet() throws Exception{
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.get("/p/list.json","json")
.accept(MediaType.APPLICATION_JSON)
.param("param1", "x")
.param("param2", "y")
).andReturn();
int status = mvcResult.getResponse().getStatus();
System.out.println("status : "+status);
String result = mvcResult.getResponse().getContentAsString();
System.out.println("result:"+result);
// Assert.assertEquals("test get ... ", "","");
}
此时会报406错误,也就是HTTP 406,NOT ACCEPTABLE。这是因为在 MockMvcBuilders.standaloneSetup(ctrl).build()
内部,使用默认的messageConverter对message进行转换。
对的,这里的messageConverters没有读取你配置的messageConverter。
解决方法也很简单,只要引入SpringMVC默认的jackson依赖就可以了。之所以报406,是因为缺少可用的消息转化器,spring默认的消息转化器都配置了Content-Type。如果我的请求头里指定了ACCEPT为application/json,但是由于没有能转换此种类型的转换器。就会导致406错误。
补充一下,mockMvc测试的时候,使用standaloneSetup方式测试,也可指定MessageConverter或拦截器,添加方法如下(需要在xml装配需要注入的类):
XXController ctrl = this.applicationContext.getBean(XXController .class);
FastJsonHttpMessageConverter fastjsonMC = this.applicationContext.getBean(FastJsonHttpMessageConverter.class);
StringHttpMessageConverter stringMC = this.applicationContext.getBean(StringHttpMessageConverter.class);
MessageInterceptor inter = this.applicationContext.getBean(MessageInterceptor.class);
mockMvc = MockMvcBuilders.standaloneSetup(ctrl)
.setMessageConverters(fastjsonMC,stringMC)
.addInterceptors(inter)
.build();
来源:oschina
链接:https://my.oschina.net/u/178410/blog/335487