springmvc使用@RequestBody时报400错误

来源:互联网 发布:魅蓝note3网络制式 编辑:程序博客网 时间:2024/04/29 05:12

首先前台发送json字符串的时候,后台才使用@RequestBody,好处是一些复杂数据类型也可以接收。使用jquery一般如下发送

<script type="text/javascript">function dologin(){     var user={};        user.loginname = "zhansan";        user.password = "123456";        $.ajax({            type:'POST',            url:'login.json',            dataType:"json",                  contentType:"application/json",               data:JSON.stringify(user),            success:function(data){                 if(data.success){                    location.href="index.jsp";                }            }       });}</script>

注意,data的值使用了JSON.stringify(),它是一个json字符串,而不是对象。

后台接收:

@RequestMapping("/login")public void login(@RequestBody LoginParam param){System.out.println(param.toString());}

当前台传过来的json字符串里包含了目标类型中没有的属性名的时候就会报错,一般就是报400错误。比如上面的js代码中如果user还有个属性yz,而后台LoginParam中没有yz这个属性,那默认情况下就会报错。

实际上是springmvc调用jackson进行数据转换时发生了错误。springmvc默认使用Jackson的objectmapper类来进行转换工作,而objectmapper在转换的时候默认情况下是如果在目标类中找不到json字符串中的属性就会报错。

这里贴出针对1.x版本jackson的两种解决方法,2.x版本解决方法类似。

方法一:在目标类上加注解@JsonIgnoreProperties,类似:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;@JsonIgnoreProperties(ignoreUnknown = true)//忽略未知属性public class LoginParam {    ........}
方法二:写个objectmapper注入到MappingJacksonHttpMessageConverter中可以一劳永逸的解决这个问题

配置文件:

<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">        <property name="supportedMediaTypes" value="application/json;charset=UTF-8" />        <property name="objectMapper" ref="MyObjectMapper" /></bean>
<bean id="MyObjectMapper" class="xx.MyObjectMapper"></bean>
objectMapper类:

import org.codehaus.jackson.map.DeserializationConfig;import org.codehaus.jackson.map.ObjectMapper;public class MyObjectMapper extends ObjectMapper {    public MyObjectMapper(){        //目标类中找不到json字符串中属性时直接忽略        this.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);    }}




0 0
原创粉丝点击