Spring使用自定义约束(如内置约束)在BindingError中设置字段错误的方法是什么?(NotNull,…)
我正在实现自定义hibernate约束。但是BindingResult的结果在我的自定义约束和内置约束(如@NotNull)之间是不同的Spring使用自定义约束(如内置约束)在BindingError中设置字段错误的方法是什么?(NotNull,…),spring,hibernate,spring-mvc,Spring,Hibernate,Spring Mvc,我正在实现自定义hibernate约束。但是BindingResult的结果在我的自定义约束和内置约束(如@NotNull)之间是不同的 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = AtLeastOneElementNotBlank.AtLeastOneElementNotBlankValidator.class) @Documented public @int
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AtLeastOneElementNotBlank.AtLeastOneElementNotBlankValidator.class)
@Documented
public @interface AtLeastOneElementNotBlank {
String message() default "{org.hibernate.validator.constraints.NotBlank.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String[] fieldNames();
class AtLeastOneElementNotBlankValidator implements ConstraintValidator<AtLeastOneElementNotBlank, Object> {
private String[] fieldNames;
@Override
public void initialize(AtLeastOneElementNotBlank constraintAnnotation) {
this.fieldNames = constraintAnnotation.fieldNames();
}
@Override
public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
if (object == null) {
return true;
}
try {
for (String fieldName : fieldNames) {
Object property = PropertyUtils.getProperty(object, fieldName);
if (property != null && !property.toString().equals("")) {
return true;
}
}
return false;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
验证结果=
org.springframework.validation.BeanPropertyBindingResult:1个错误
字段“searchKeyword”上的对象“searchParam”中存在字段错误:已拒绝
值[null];代码
[NotBlank.searchParam.searchKeyword,NotBlank.searchKeyword,NotBlank.java.lang.String,NotBlank];
论据
[org.springframework.context.support.DefaultMessageSourceResolvable:
代码[searchParam.searchKeyword,searchKeyword];参数[];默认值
消息[搜索关键字]];默认消息[xxx]
验证结果=
org.springframework.validation.BeanPropertyBindingResult:1个错误
对象“VAdCommonCode”中出错:代码
[AtLeastOneElementNotBlank.VAdCommonCode,AtLeastOneElementNotBlank];
论据
[org.springframework.context.support.DefaultMessageSourceResolvable:
代码[VAdCommonCode.,];参数[];默认消息
[],[Ljava.lang.String;@5065f440];默认消息[xxx]
因此,此代码不提供任何自定义约束的错误信息
List<ValidationError> validationErrors = new ArrayList<>();
List<FieldError> fieldErrors = validationResult.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
ValidationError validationError = new ValidationError();
validationError.setValidationCode(fieldError.getCode());
validationError.setErrorMessage(fieldError.getDefaultMessage());
validationError.setParamName(fieldError.getField());
validationError.setRejectedValue(fieldError.getRejectedValue());
validationErrors.add(validationError);
}
@Data
class ValidationError {
private String validationCode;
private String errorMessage;
private String paramName;
private Object rejectedValue;
}
List validationErrors=new ArrayList();
List fieldErrors=validationResult.getFieldErrors();
用于(FieldError FieldError:fieldErrors){
ValidationError ValidationError=新的ValidationError();
validationError.setValidationCode(fieldError.getCode());
validationError.setErrorMessage(fieldError.getDefaultMessage());
validationError.setParamName(fieldError.getField());
validationError.setRejectedValue(fieldError.getRejectedValue());
添加(validationError);
}
@资料
类验证错误{
私有字符串验证码;
私有字符串错误消息;
私有字符串参数名;
私有对象拒绝值;
}
Spring是否有一种方法可以通过自定义约束设置BindingError中的字段错误
List<ValidationError> validationErrors = new ArrayList<>();
List<FieldError> fieldErrors = validationResult.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
ValidationError validationError = new ValidationError();
validationError.setValidationCode(fieldError.getCode());
validationError.setErrorMessage(fieldError.getDefaultMessage());
validationError.setParamName(fieldError.getField());
validationError.setRejectedValue(fieldError.getRejectedValue());
validationErrors.add(validationError);
}
@Data
class ValidationError {
private String validationCode;
private String errorMessage;
private String paramName;
private Object rejectedValue;
}