問題:如何在驗證器中為 List 目標的錯誤設定正確的嵌套路徑以呼叫其他驗證器?
代碼參考:嵌套物件的嵌套彈簧驗證器
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 的回傳型別是否與引數型別匹配二傳手?在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.validation.AbstractPropertyBindingResult 的 org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:615)。
uj5u.com熱心網友回復:
org.springframework.validation.Validator無法驗證List<Object>為target. 您必須使用 getter 將串列包裝在單個物件中,以讓驗證器找到訪問子物件的路徑。
public class AllergyDtoListValidator implements Validator {
private AllergyDtoValidator allergyDtoValidator;
@Override
public boolean supports(Class<?> clazz) {
return AllergyDtoList.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
allergyDtoValidator = new AllergyDtoValidator();
AllergyDtoList request = (AllergyDtoList) target;
for (int i = 0; i < request.size(); i ) {
// sub path name must be same as property name to enable Validator to use
// getter in the object AllergyDtoList
errors.pushNestedPath("allergies[" i "]");
ValidationUtils.invokeValidator(this.allergyDtoValidator, request.get(i), errors);
errors.popNestedPath();
}
}
}
// new wrapping object to be validated
class AllergyDtoList {
List<AllergyDto> allergies;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409959.html
標籤:
