@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 });

 

posted @ 2014-07-31 11:51  havery  阅读(670)  评论(0)    收藏  举报