Spring MVC后端ajax验证

时间:2015-09-11 14:31:18

标签: javascript json ajax spring

对于我当前的项目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是一个简单的例子。

有谁知道如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

我通过解析控制器中的JSON并在用户对象中设置它来修复验证。然后将用户对象放入我的UserValidator类并进行验证。

使用验证器链接了解更多信息:

http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/validation.html