REST api的Spring验证器只能部分工作

时间:2017-05-30 10:55:04

标签: java spring validation spring-boot spring-validator

我正在使用Spring Boot 1.5.3.RELEASE。我正在尝试使用 org.springframework.validation.Validator 验证Spring Boot REST api。 Spring验证器有几种验证实体的方法,所以当我调用

ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "field.required");

一切正常,请求因验证错误而失败,但进一步执行不同的验证

if (!StringUtils.isAllLowerCase(request.getId())) {
  errors.rejectValue("id", "Id should be lowercase");
}

虽然代码实际执行并且 rejectValue 方法实际被调用但由于某些原因而没有停止处理请求,所以没有任何反应。

所以问题是为什么验证没有发生,也许有不同的方法通过Spring / Spring-Boot执行验证。我有很多复杂的验证,所以我尽量避免使用JSR-303并创建大量的自定义注释。

RequestValidator

import com.user.model.TenantRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

@Component
public class TenantRequestValidator implements Validator {

@Override
public boolean supports(Class<?> clazz) {
    return TenantRequest.class.isAssignableFrom(clazz);
}

@Override
public void validate(Object target, Errors errors) {
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "field.required");

    TenantRequest request = (TenantRequest) target;

    if (!StringUtils.isAllLowerCase(request.getId())) {
      errors.rejectValue("id", "Id should be lowercase");
    }


}
}

1 个答案:

答案 0 :(得分:1)

提供有关TenantRequest.java的详细信息

现在可以尝试删除@Component,因为你正在实现Validator。

参考我创建的工作样本https://github.com/Roshanmutha/rcmutha-SpringFormUIValidation/blob/master/src/main/java/com/rcmutha/SpringInputValidation/EmployeeFormValidator.java

你还在控制器中添加了以下内容吗?

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new EmployeeFormValidator());
}