通过ajax给springMVC传递参数时,通过post方法传递json字符串时常用的方式,这时后端应该通过@RequestBody注解配合springMVC中配置的消息转换器来进行json字符串的解析。
因为post方法中的json字符串通常是一个前端的json对象转化而成的字符串,所以后端@RequestBody后面可以使用HashMap<String,Object>类型来接收所有参数。
通过这种方式可以非显式的传送大量的参数到后端,并且和具体参数无关,便于以后对参数进行扩展,对于不确定参数的场合,这种方式解除了与具体参数的耦合。但是由于简单的过程实际上经历了许多SpringMVC的操作,所以经常会遇到各种奇怪问题。
其中post方法请求体中的json字符串无法成功通过SpringMVC中配置的MessageConverter(一般是MappingJackson2HttpMessageConverter)转换为@RequestBody注解的HashMap对象,是可以见到的问题。
这个时候你可以检查下ajax请求的content-type请求头,因为在配置MessageConverter消息转换器的时候,需要配置其所检查的请求体类型(content-type),默认情况下浏览器的ajax会添加content-type:application/x-www-form-urlencoded的请求头,但是有的浏览器或者有些时候会发送content-type:application/x-www-form-urlencoded;charset:utf-8到后端,导致MappingJackson2HttpMessageConverter漏过对它的检查,这个时候SpringMVC会使用其他的MessageConverter来解析request body中的内容,这样肯定是会解析失败的。
如果遇到这种情况,比较好的解决方式,可能是在ajax的post请求中强制注明 contentType:application/json,并将application/json 和application/json;charset=utf-8两种MediaType(MimeType)添加到MappingJackson2HttpMessageConverter对象的检查列表中。这样就可以保证post方法的请求体中的json字符串被MappingJackson2HttpMessageConverter对象检查并解析。