对于我当前的项目Java / Spring项目,我必须验证表单。该网页是一个自由标记模板文件。
<form>
没有特殊属性可以将数据发送到控制器。该项目使用Ajax发送请求。控制器根本没有收到表格。
当用户提交数据时,调用JavaScript函数通过收集elementID来接收所有数据。数据放在一个变量中,如(短版);
var userId = document.getElementById('input_id').value.toLowerCase();
var width = document.getElementById("width");
var height = document.getElementById("height");
然后该函数将所有data
放入JSON中。这个JSON放在Ajax中,然后Ajax调用正确的控制器。
** Ajax代码**
$.ajax({
url: url,
type: "POST",
dataType: "json", // expected format for response
contentType: "application/json", // send as JSON
Accept: "text/plain; charset=utf-8",
"Content-Type": "text/plain; charset=utf-8",
data: data,
success: function (response) {
// we have the response
if (response.status == "SUCCESS") {
console.log("succes");
//Redirect to the right page if the user has been saved successfully
if (type === "setupuser") {
window.location = "/setup/user/" + userId;
} else if (type === "simulatoruser") {
window.location = "/simulator/user/" + userId;
}
} else {
errorInfo = "";
for (i = 0; i < response.result.length; i++) {
errorInfo += "<br>" + (i + 1) + ". " + response.result[i].code;
}
$('#error').html("Please correct following errors: " + errorInfo);
$('#info').hide('slow');
$('#error').show('slow');
}
},
error: function (e) {
alert('Error: ' + e);
}
});
Ajax请求调用以下控制器:
@RequestMapping(method = RequestMethod.POST, value = "/adduser/{userType}")
@ResponseBody
JsonResponse addUserMapping(@ModelAttribute(value="user") User user, BindingResult result, @RequestBody String jsonString, @PathVariable String userType) {
def json = new JsonSlurper().parseText(jsonString)
String userId = json.userId
String userName = json.userName
user.setId(userId)
user.setName(userName)
log.warn("User id..... "+user.getId())
log.warn("User name..... "+user.getName())
JsonResponse res = new JsonResponse();
ValidationUtils.rejectIfEmpty(result, "id", "userId can not be empty.");
ValidationUtils.rejectIfEmpty(result, "name", "userName can not be empty");
if(!result.hasErrors()){
userService.addUser(jsonString)
res.setStatus("SUCCESS");
}else{
res.setStatus("FAIL");
res.setResult(result.getAllErrors());
}
return res;
}
如您所见,Ajax将JSON发送到控制器。控制器解压缩JSON并将数据放入用户对象。然后使用"rejectIfEmpty()"
方法验证用户对象...
现在我一直在阅读关于使userValidator
类扩展Validator
,或者只是将Annotations放在bean类中,如:
@Size(min=1, max=3)
我更喜欢这些注释,因为您不必编写用于检查某些简单事物的特殊代码(例如字段不为空...... @NotEmpty
)
但是这不起作用,因为控制器不会在调用它的第二个用户对象时使用它,而是接受JSON然后解压缩它(验证为时已晚......)
TL:DR
Controller将JSON作为参数而不是Object。必须解压缩JSON,然后使用rejectIfEmpty
作为java对象在控制器中进行验证。我不希望整页重新加载,但我仍然希望保留Ajax。
顺便说一句:我想针对更多像regex等来验证数据。但是rejectifEmpty是一个简单的例子。
有谁知道如何处理这个问题?
答案 0 :(得分:0)
我通过解析控制器中的JSON并在用户对象中设置它来修复验证。然后将用户对象放入我的UserValidator类并进行验证。
使用验证器链接了解更多信息:
http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/validation.html