【发布时间】:2022-01-05 11:56:25
【问题描述】:
问题:如何在验证器中为 List 目标设置正确的嵌套路径以调用其他验证器?
代码参考:nested spring validator for nested object
public class AllergyDtoListValidator implements Validator {
private AllergyDtoValidator allergyDtoValidator;
@Override
public boolean supports(Class<?> clazz) {
return new TypeToken<List<AllergyDto>>() {
}.getType().equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
allergyDtoValidator = new AllergyDtoValidator();
List<AllergyDto> request = (List<AllergyDto>) target;
for (int i = 0; i < request.size(); i++) {
// below line causes the exception
errors.pushNestedPath(String.valueOf(i));
ValidationUtils.invokeValidator(this.allergyDtoValidator, request.get(i), errors);
errors.popNestedPath();
}
}
}
public class AllergyDtoValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return AllergyDto.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
AllergyDto request = (AllergyDto) target;
log.info("Enter allergy validator {}", request.toString());
try {
// field allergyTypeCode
if (request.getAllergyTypeCode() == null || request.getAllergyTypeCode().isEmpty()) {
errors.rejectValue("allergyTypeCode", "Cannot be null nor whitespace");
} else if (request.getAllergyTypeCode().length() > 8) {
errors.rejectValue("allergyTypeCode", "Exceed max length");
}
// field allergyCode
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "allergyCode", "Cannot be null nor "
+ "whitespace");
if (request.getAllergyCode() != null && request.getAllergyCode().length() > 8) {
errors.rejectValue("allergyCode", "Exceed max length");
}
// field allergyName
if (request.getAllergyName() != null && request.getAllergyName().length() > 66) {
errors.rejectValue("allergyName", "Exceed max length");
}
// field remarks
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "remarks", "Cannot be null nor whitespace");
if (request.getRemarks() != null && request.getRemarks().length() > 255) {
errors.rejectValue("remarks", "Exceed max length");
}
} catch (Exception e) {
log.info("Exception {}", e);
}
log.info("allergy errors {}", errors.toString());
}
}
public class AllergyDto implements Serializable {
private static final long serialVersionUID = 2319040437020676767L;
@JsonProperty("allergy_type_code")
private String allergyTypeCode;
@JsonProperty("allergy_code")
private String allergyCode;
@JsonProperty("allergy_name")
private String allergyName;
@JsonProperty("remarks")
private String remarks;
// getters and setters
}
当我跑步时
// req is List<AllergyDto>
allergyDtoListValidator.validate(req, bindingResult);
我遇到了异常
org.springframework.beans.NotReadablePropertyException: 无效 bean 类 [java.util.ArrayList] 的属性“0”:Bean 属性“0”是 不可读或具有无效的 getter 方法:返回类型是否 getter 是否匹配 setter 的参数类型?在 org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:627) 在 org.springframework.beans.AbstractNestablePropertyAccessor.getNestedPropertyAccessor(AbstractNestablePropertyAccessor.java:843) 在 org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyAccessorForPropertyPath(AbstractNestablePropertyAccessor.java:820) 在 org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:615) 在 org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:104) 在 org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:228) 在 org.springframework.validation.ValidationUtils.rejectIfEmptyOrWhitespace(ValidationUtils.java:252) 在 org.springframework.validation.ValidationUtils.rejectIfEmptyOrWhitespace(ValidationUtils.java:191) 在 sg.gov.hpb.yhms.medical_service.validators.AllergyDtoValidator.validate(AllergyDtoValidator.java:32) 在 org.springframework.validation.ValidationUtils.invokeValidator(ValidationUtils.java:89) 在 org.springframework.validation.ValidationUtils.invokeValidator(ValidationUtils.java:56) 在 sg.gov.hpb.yhms.medical_service.validators.AllergyDtoListValidator.validate(AllergyDtoListValidator.java:32)
【问题讨论】:
-
如果您使用小于 5 的 Spring 版本,则将 AllArgs 构造函数添加到 AllergyDtoListValidator 和 @Autowired
-
试过但同样的异常仍然存在@DmitriiBykov
标签: java spring validation