Spring REST api 的验证器仅部分工作
Spring validator for REST api works only partially
我正在使用 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 并创建大量自定义注释。
请求验证器
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");
}
}
}
提供有关 TenantRequest.java
的详细信息
现在您可以尝试删除 @Component,因为您正在实施验证器,因此不需要它。
您是否在控制器中添加了以下内容?
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new EmployeeFormValidator());
}
我正在使用 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 并创建大量自定义注释。
请求验证器
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");
}
}
}
提供有关 TenantRequest.java
的详细信息现在您可以尝试删除 @Component,因为您正在实施验证器,因此不需要它。
您是否在控制器中添加了以下内容?
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new EmployeeFormValidator());
}