SpringMVC @ResponseBody注解 json转换 返回406

1、描述

SpringMVC通过@RequestMapping注解,自动将对象转换为接送返回。浏览器请求后却返回406错误码。

@Controller
public class IndexAction {
    @RequestMapping("/userList")
    public @ResponseBody List<TXUser> userList(String updated_at){
        System.out.println(updated_at);
        TXUser user1=new TXUser();
        user1.setAccount("a1");
        user1.setCode("11");
        user1.setCreated_at(new Date());
        user1.setName("user1");
        TXUser user2=new TXUser();
        user2.setAccount("a2");
        user2.setCode("22");
        user2.setCreated_at(new Date());
        user2.setName("user2");

        List<TXUser> userslist=new ArrayList<TXUser>();
        userslist.add(user1);
        userslist.add(user2);
        return userslist;
    }

    @RequestMapping("/index")
    public String index(){
        return "index";
    }
}

2、原因

网上找过相关解决方法,但都是修改SpringMVC配置文件添加Converter。我对应修改后均无效。通过debug,发现返回406的原因是因为org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor中的writeWithMessageConverters方法出现异常。

List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(servletRequest);
List<MediaType> producibleMediaTypes = getProducibleMediaTypes(servletRequest, returnValueClass);
Set<MediaType> compatibleMediaTypes = new LinkedHashSet<MediaType>();
for (MediaType requestedType : requestedMediaTypes) {
    for (MediaType producibleType : producibleMediaTypes) {
        if (requestedType.isCompatibleWith(producibleType)) {
            compatibleMediaTypes.add(getMostSpecificMediaType(requestedType, producibleType));
        }
    }
}

以上代码中,各个变量的值最后分别为

变量
requestedMediaTypes[text/html]
producibleMediaTypes[application/json;charset=UTF-8,application/x-www-form-urlencoded;charset=UTF-8,application/json;charset=UTF-8,application/*+json;charset=UTF-8]
compatibleMediaTypes[]

其中requestedMediaTypes为浏览器向SpringMVC的请求头,由于不匹配SpringMVC对应的请求头,最后返回406。

3、解决办法

找到对应原因,通过网络查找资料后,发现修改web.xml文件
原:

<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

修改后:

<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

修改xml后,浏览器再次请求后,正常返回json,不会返回406错误码了。
此时再次debug,三个变量的值分别为

变量
requestedMediaTypes[text/html,application/xhtml+xml, image/webp,application/xml;q=0.9,* /*;q=0.8]
producibleMediaTypes[application/json;charset=UTF-8,application/x-www-form-urlencoded;charset=UTF-8,application/json;charset=UTF-8, application/*+json;charset=UTF-8]
compatibleMediaTypes[application/json;charset=UTF-8;q=0.8,application/x-www-form-urlencoded;charset=UTF-8;q=0.8,application/*+json;charset=UTF-8;q=0.8]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值