SpringMVC3.2.x整合Fastjson与Controller单元测试

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进行转换。

SpringMVC3.2.x整合Fastjson与Controller单元测试_第1张图片

SpringMVC3.2.x整合Fastjson与Controller单元测试_第2张图片
对的,这里的messageConverters没有读取你配置的messageConverter。

SpringMVC3.2.x整合Fastjson与Controller单元测试_第3张图片

解决方法也很简单,只要引入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();

你可能感兴趣的:(fastjson,acceptable,406,not)