在SpringMVC中使用@RequestBody和@ModelAttribute注解时遇到了很多问题,现记录下来。

  @ModelAttribute这个注解主要是将客户端请求的参数绑定参数到一个对象上,不用将很多参数@RequestParam或是@PathVariable。

但是在使用过程中遇到了问题,

第一次Html端请求代码如下,请求方式1

// 简单键值对
var data = {
productTypeIds : vproducttypeid,
channelTypeId : vchanneltypeid,
userId : 1,
}; // 提交保存
$.ajax({
"type" : "POST",
"url" : chainelUtil.URL.ACTION_IMPORT,
"data" : data,
"success" : function(data) {
bootbox.alertTimeout("创建成功!");
},
"error" : function(data) {
bootbox.alertTimeout("创建失败!");
}
});

Controller代码如下:

@RequestMapping(value = "/importstorestore", method = RequestMethod.POST)
@ResponseBody
public Object importStoreToStoreTree(@ModelAttribute StoreStoreRelationVO storeRelationVO ) {
}

StoreStoreRelationVO代码如下:

@Component
public class StoreStoreRelationVO implements Serializable{ /**
*
*/
private static final long serialVersionUID = 1L; // 渠道关系实体
private StoreStoreEntity storeStoreEntity; // 渠道类型Id
private String channelTypeId; // 商品分类Id字符串以","分割
private String productTypeIds; // 商品分类Id List
private List<String> productTypeIdList; // 区域Id,目前版本可能用不上
private String regionId; // 当前登陆用户
private String userId;
// 省略getter setter
}

StoreStoreEntity如下:

@Entity
@Table(name = "base_store_store")
public class StoreStoreEntity implements Serializable{ /**
*
*/
private static final long serialVersionUID = 1L; @Id
@Column
@GenericGenerator(name = "idGenerator", strategy = "increment")
@GeneratedValue(generator = "idGenerator")
private Long id; // 上级id
private Long upstoreid; // 下级id
private Long downstoreid; // 所属渠道id
private Long channelid;
// 省略getter 和 setter
}

如上的请求没问,服务器端可以接受到数据。

但是如果将请求的参数修改为如下,对象中组合对象,因为StoreStoreRelationVO 有个属性是StoreStoreEntity

// StoreStoreEntity
var storeStore = {
upstoreid : vupstoreid,
downstoreid:vcurrentstoreid,
channelid:1,
};
// StoreStoreRelationVO 
var data = {
storeStoreEntity:storeStore,
productTypeIds : vproducttypeid,
channelTypeId : vchanneltypeid,
userId : 1,
};

如果用请求方式1请求,直接报错

HTTP Status 404 -


type Status report

message

description The requested resource is not available.


Apache Tomcat/7.0.52

我将Ajax请求参数改为Json,如下,请求方式2

// 提交保存
$.ajax({
"type" : "POST",
"dataType" : 'json',
"contentType" : "application/json;charset=UTF-8",
"url" : chainelUtil.URL.ACTION_IMPORT,"data" : JSON.stringify(data),
"success" : function(data) {
var messagetext = $('#message');
messagetext.html("已经向系统成功提交申请,创建成功!");
bootbox.alertTimeout("创建成功!");
},
"error" : function(data) {
var messagetext = $('#message');
messagetext.html("服务器繁忙,请重新提交!");
bootbox.alertTimeout("创建失败!");
}
});

服务器端不变,这样不报错了,但是storeRelationVO却接收不到数据,不能自动装载。

我将Controller中的@ModelAttribute修改为@RequestBody

storeRelationVO可以正常接受到数据。

----------------------------------------------------------------------

为什么Json就能正确成功呢,我又将Ajax改回到最初格式,参数格式不设定

$.ajax({
"type" : "POST",
"url" : chainelUtil.URL.ACTION_IMPORT,
"data" : data,
"success" : function(data) {
bootbox.alertTimeout("创建成功!");
},
"error" : function(data) {
bootbox.alertTimeout("创建失败!");
}
});

结果不出所料,报错,415 Unsupported Media Type

HTTP Status 415 -


type Status report

message

description The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.


Apache Tomcat/7.0.52

看来用@RequestBody,需要传Json数据

----------------------------------

我将请求参数稍微改了一下,其余不变

var storeStore = {
upstoreid : vupstoreid,
downstoreid:vcurrentstoreid,
channelid:1,
}; var data = {
storeStoreEntity:storeStore,
productTypeIds : vproducttypeid,
channelTypeId : vchanneltypeid,
userid : 1,
};

结果报错,这个错我找了好久啊,最后发现一个大小写错误,userid应该对应实体中的userId,一个i应该是大写,所以请求参数不区分大小写!

HTTP Status 400 -


type Status report

message

description The request sent by the client was syntactically incorrect.


Apache Tomcat/7.0.52

SpringMVC---400错误The request sent by the client was syntactically incorrect ()的更多相关文章

  1. SpringMVC报错The request sent by the client was syntactically incorrect ()

    springmvc数据绑定出的错 在数据绑定的时候一定要主意Controller方法中的参数名和jsp页面里的参数名字是否一致或者按照绑定的规范来写, 如果不一致,可能回报如下错误: The requ ...

  2. HTTP Status 400 - description The request sent by the client was syntactically incorrect.

    HTTP Status 400 - type Status report message description The request sent by the client was syntacti ...

  3. 错误400-The request sent by the client was syntactically incorrect

    springMVC中,某个页面提交时报400错误,如下图.     解决方法: 1.在网上找了一下,答案是通常遇到这个错误是因为前端jsp页面的控件名称和controller中接收的参数名称不一致.但 ...

  4. 错误The request sent by the client was syntactically incorrect ()的解决

    http://www.cnblogs.com/xiandedanteng/p/4168609.html 这个错误是SpringMVC报出来的,见到它意味着html/jsp页面的控件名称 和 contr ...

  5. 错误:The request sent by the client was syntactically incorrect的解决

    问题: 错误400-The request sent by the client was syntactically incorrect. springMVC中,某个页面提交时报400错误,如下图. ...

  6. The request sent by the client was syntactically incorrect.

    HTTP Status 400 - type Status report message description The request sent by the client was syntacti ...

  7. 又见The request sent by the client was syntactically incorrect ()

    前几天遇到过这个问题(Ref:http://www.cnblogs.com/xiandedanteng/p/4168609.html),问题在页面的组件name和和注解的@param名匹配不对,这个好 ...

  8. "The request sent by the client was syntactically incorrect ()"问题定位及解决:

    Spring MVC "The request sent by the client was syntactically incorrect ()"解决办法: 把spring日志级 ...

  9. The request sent by the client was syntactically incorrect问题解决

    The request sent by the client was syntactically incorrect意思嘛,google翻译一下 通过日志不难看出,是由参数不匹配造成的. 所以对于Da ...

随机推荐

  1. ORB(oriented FAST and rotated BRIEF)特征提取与检测

    ORB采取FAST算法检测特征点,采取BRIEF算法计算特征点描述子. 1.检测特征点 检测候选特征点周围一圈的像素值,若有足够多的像素值与候选特征点的差异都较大,则认为该候选特征点是特征点. 对于上 ...

  2. s21day04 python笔记

    s21day04 python笔记 一.上周知识回顾及补充 回顾 补充 编译型语言和解释性语言 编译型:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行 常见的编译型语言:C,C++,Ja ...

  3. jmeter定时器

    一.定时器的作用 1.定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面): 2.当执行一个sampler之前时,所有当前作用域内的定时器都会被执 ...

  4. acm 2043

    ////////////////////////////////////////////////////////////////////////////////#include<iostream ...

  5. break与continue关键字的使用

    break与continue关键字的使用break:使用在switch-case中或者循环中 如果使用在循环中,表示:结束当前循环 public class V{ public static void ...

  6. ionic项目中 软键盘弹出之后的问题:

    Android SDK目前提供的软键盘弹出模式接口只有两种: 一是弹出时自动回冲界面,将所有元素上顶: 一种则是不重绘界面,直接将控件元素遮住:     1. ionic 中弹出键盘遮挡住输入框(覆盖 ...

  7. WebService 学习记录

    -------------------------------------------PS:这个WebService 服务必须一直开着,关闭就没法访问了 Web Service 教程 一.webser ...

  8. golang 内存占用测量

    web服务中加入如下 import ( "runtime" "time" "fmt" ) go func() { for { var m r ...

  9. Gravitee.io Access Management 组件

    Access Management组件在Gravitee.io 主要是进行认证以及权鉴的处理,支持oauth2 以及openid connect 等协议,同时好多功能已经集成在ui 管理界面上了,还是 ...

  10. css3新增内容

    1.css3边框 border-radius box-shadow border-image 2.背景 background-size background-origin 3.文本效果 text-sh ...