@RequestBody注解415错误
背景:
Extjs5+springMVC4
Spring配置:
<beans:bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:list>
<beans:value>text/html;charset=UTF-8</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="mappingJacksonHttpMessageConverter" />
</beans:list>
</beans:property>
</beans:bean>
使用@RequestBody尝试转换json为Javabean,返回HTTP错误码415 Unsupported media type
代码追踪
是实现转换的Jackson包抛出异常,而Spring拦截了该异常,错误信息丢失。
原因有很多:
1.Javabean没有实现无参数的构造方法
2.Javabean无法序列化,有可能是定义Javabean的是内部类
3.Javabean不能是抽象类,包括类型为类的属性
4.发送的数据属性必须在Javabean中存在
5.其它(待追加)
追加1:
前面都是使用AJAX方式提交请求:
1 Ext.Ajax.request({ 2 method:'POST', 3 url:getContextPath()+'/screenContent', 4 jsonData: { 'stringContent':'cmuserGrid', 5 'object':{'userName':'testttt1'}, 6 'objects':[{'userName':'testttt2'},{'userName':'testttt3'}] 7 }, 8 success:function(response){ 9 //var res=Ext.JSON.decode(response.responseText.trim()); 10 alert(response.responseText.trim()); 11 }, 12 failure:function(){ 13 Ext.Msg.alert('Info','Unknown ERROR!'); 14 } 15 });
后来改为Ext.data.store使用Ajax Proxy发送请求,再次发生这个错误。
查看请求头信息,发现ExtJS对我的Json参数进行了处理,最终把我的Json处理成字符串,又加了三个参数。
查看Ajax Proxy源文件发现有一个paramsAsJson属性,默认值false;
原来Extjs某人使用params作参数,所以发生上述情况。
paramsAsJson=true即表示使用jsonData作参数传输。
把paramsAsJson设为true,执行。
查看http请求头信息,发现数据格式发生了变化,继续执行,果断成功。
代码如下:
1 var store = Ext.create('Ext.data.Store', { 2 proxy: { 3 type: 'ajax', 4 url:url, 5 paramsAsJson:true, 6 actionMethods:{ 7 create: "POST", read: "POST", update: "POST", destroy: "POST" 8 }, 9 noCache: false,//remove _dc params 10 headers: { "Accept": 'application/json', "Content-Type": 'application/json;' }, 11 reader: { 12 type : 'json' 13 } 14 } 15 }); 16 17 store .load({ 18 params:{'stringContent':applicationId}, 19 timeout : TRF.cnst.getApplicationContentsTimeout, 20 scope: this, 21 callback:function(records, operation, success){} 22 });