今天踩的坑,记录一下。本来前端使用ajax只传了一个参数给后台,没有拼json串,后台从request中取的值。后来想要多传一个参数,那不如直接传个对象,手动转json串很low,既然spring mvc可以帮我们做,那就用它的。
只传一个参数前后端代码如下:
function verifyRepeateName() {
var nameVal = $('#name').val();
var requestUrl = '[[@{/}]]' + 'testSuite/verifyRepeateName';
$.ajax({type:'post', url:requestUrl, async:true, data:{name:nameVal}, success:function(result){
console.log('result:' + result);
if(result != '') {
$('#errorMsg').text(result);
}
}});
}
@RequestMapping(value = "/verifyRepeateName", method = RequestMethod.POST)
@ResponseBody
public String verifyRepeateName(HttpServletRequest request) {
String name = request.getParameter("name");
if(!StringUtils.isEmpty(name)) {
boolean repeatedFlag = testSuiteService.verifyRepeateName(name);
if(repeatedFlag) {
return ResponseConstant.REPEATEDNAMEVALUE;
} else {
return "";
}
} else {
return "";
}
}
传json串的方法如下:
1、spring mvc 用jaskson做json和对象互相转换,故引入
<!--spring mvc jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.7</version>
</dependency>
2、发请求时指定数据类型为json
dataType:"json",
contentType:"application/json",
不加这两个报415
3、传的json是手动拼的,格式不对,报415,可是格式改了之后报400,这样根本不知道是哪里错误了,找到了一个在后台打印错误的方法。参考http://www.jb51.net/article/120350.htm
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public String messageNotReadable(HttpMessageNotReadableException exception,
HttpServletResponse response){
logger.error("请求参数不匹配。", exception);
return exception.getMessage();
}
后台有打印错误了:
[2018-02-01 15:46:54,708] [http-nio-7280-exec-10] [ERROR] com.picc.autoplateform.controller.TestSuiteController 请求参数不匹配。
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not construct instance of com.picc.autoplateform.model.TestSuite: no String-argument constructor/factory method to deserialize from String value ('{"testsuiteid":"7f429842-2c99-4f13-8208-852e8881a23c", "memo":"test", "runenv":"", "runtime":"", "projectid":"", "browsertype":"","userid":"", "createtime":"", "validflag":"", "name":"", "runtype":""}');
大致意思就是无法解析json串咯,不知道为什么,此时json格式是正确的。
于是手动建一个对象,再转成json串,竟然可以了。
4、前后台代码如下
function verifyRepeateName() {
var obj = {};
obj.testsuiteid = '[[${TESTSUITEEDIT.testsuiteid}]]';
obj.name = $('#name').val();
console.log('obj:' + obj);
console.log('JSON.stringify(obj):' + JSON.stringify(obj));
var requestUrl = '[[@{/}]]' + 'testSuite/verifyRepeateName';
var resultMsg = '';
$.ajax({type:'post',
url:requestUrl,
async:false,
dataType:"json",
contentType:"application/json",
data:JSON.stringify(obj),
success:function(result){
console.log('success result:' + result);
$('#errorMsg').text(result.responseMsg);
}, error: function(result) {
console.log('error result:' + result);
}
});
}
@RequestMapping(value = "/verifyRepeateName", method = RequestMethod.POST)
@ResponseBody
public String verifyRepeateName(@RequestBody TestSuite testSuite) {
String name = testSuite.getName();
String testSuiteId = testSuite.getTestsuiteid();
if(!StringUtils.isEmpty(name)) {
boolean repeatedFlag = testSuiteService.verifyRepeateName(name, testSuiteId);
if(repeatedFlag) {
return "{\"responseMsg\":\"" + ResponseConstant.REPEATEDNAMEVALUE + "\"}";
} else {
return "{\"responseMsg\":\"" + ResponseConstant.NOREPEATE + "\"}";
}
} else {
return "{\"responseMsg\":\"" + ResponseConstant.NOREPEATE + "\"}";
}
}
5、注意:指定了dataType:"json",contentType:"application/json",这两项,返回数据的格式必须是json了,之前返回的是一个提示信息,报错。
网友评论