SpringMVC的JSON请求返回406(not Acceptable)解决方案汇总

Spring版本4.0.2.RELEASE

1 问题

    使用springMVC进行JSON请求时,返回报406错误。使用chrome捕获的错误截图如下:

SpringMVC的JSON请求返回406(not Acceptable)解决方案汇总_第1张图片


    下面是工程的部分代码,已经做过一些精简。

    Js代码:

$(form).ajaxSubmit({
    url: 'sysinfo/login',
    cache: false,
    success: function(data,textStatus) {
        if(data.resultCode == '200'){
            location.href = "index";
        }else{
            alert(data.resultMessage);
        }
    },
    error: function(XMLHttpRequest,textStatus,errorThown) {
        alert(“error”);
    }
});
    后台代码:
@Controller
@RequestMapping("/sysinfo")
public class SysLoginController
{
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public ResponseMessage<Object> login(User user)
    {
        // new ResponseMessage<Object>( resultCode,resultMessage);
        ResponseMessage<Object> responseMessage = new ResponseMessage<Object>("200", “登录成功”);
        return responseMessage;
    }
}

    经过debug发现,是可以进入java代码的,return一句返回结果也是预想中的(“200”,”登陆成功”),但是浏览器请求结果总是406。

2 可能产生改问题的原因

2.1 jar包问题

    login方法返回JSON,自然涉及到返回对象转换成JSON的问题。如果缺少相应jar包也会产生406问题。解决方案导入jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar。

 

2.2 @ResponseBody配置问题

    若不配置@ResponseBody,Controller默认返回字符串,使用已配置的视图解析器来解析。若配置了@ResponseBody则Controller认为返回的是数据而不是视图。前台请求json,则应该配置@ResponseBody以返回json数据。

    @RequestBody/@ResponseBody注解不使用视图解析器,而是使用HttpMessageConverter,因而需要进行相应配置。有以下两种方式:

        ·配置bean,如http://blog.csdn.net/woshiwanxin102213/article/details/37521303

        ·使用<mvc:annotation-driven>

2.3 视图数据类型问题

    spring 3.2时requestedMediaTypes却为[text/html]的情况报406错误,还有一个原因可能是由于采用的后缀有关,如果使用*.htm,*.html等,默认就会采用[text/html]编码。具体案例见http://blog.csdn.net/jia20003/article/details/21411771


3 本项目所做修正

    针对以上几个问题,本项目中使用如下配置:

Jar包依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.1.3</version>
</dependency>

 配置@ResponseBody和<mvc:annotation-driven>

<mvc:annotation-driven>
    <mvc:message-converters>
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
    <constructor-arg ref="utf8Charset" />
    </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

视图解析配置

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    <property name="contentType" value="text/html;charset=UTF-8" />
</bean>

 

    经过了对问题的各种排查和修改,终于。。。还是406(not Acceptable)!!

    最后在http://stackoverflow.com/questions/7462202/spring-json-request-getting-406-not-acceptable#中得到了解决。也是产生该问题的另一个原因,返回类型ResponseMessage中没有补全Getters and Setters。针对该对象补全所有属性的get和set方法,重新执行请求,返回数据正常。

    这种微小的错误很难排查,也是在今后的开发中是应该避免的。


你可能感兴趣的:(json,springMVC,406)