我正试图为我的RESTAPI创建一个自定义beans验证,但由于某些原因,“required=false”验证不起作用。
当我发送不带callPosition属性的JSON时,会出现以下错误。
{
"codes": [
"ValidateString.GSMPLMNRecordModel.transit.callPosition",
"ValidateString.transit.callPosition",
"ValidateString.callPosition",
"ValidateString.java.lang.String",
"ValidateString"
],
"arguments": [
{
"codes": [
"GSMPLMNRecordModel.transit.callPosition",
"transit.callPosition"
],
"arguments": null,
"defaultMessage": "transit.callPosition",
"code": "transit.callPosition"
},
[
"A",
"B",
"C",
"D"
]
],
"defaultMessage": "{com.mycompany.asn.validator.ValidateString.message}",
"objectName": "GSMPLMNRecordModel",
"field": "transit.callPosition",
"rejectedValue": null,
"bindingFailure": false,
"code": "ValidateString"
},
在我的模型中:
@JsonProperty(required = false)
@ValidateString(acceptedValues = {"A","B","C","D"})
private String callPosition;
注释:
@Documented
@Constraint(validatedBy = StringValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@ReportAsSingleViolation
public @interface ValidateString {
String[] acceptedValues();
String message() default "{com.mycompany.validator.ValidateString.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
验证人:
public class StringValidator implements ConstraintValidator<ValidateString, String> {
private List<String> valueList;
@Override
public void initialize(ValidateString validateString) {
valueList = new ArrayList<String>();
for (String val : validateString.acceptedValues()) {
valueList.add(val.toUpperCase());
}
}
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
return value != null && valueList.contains(value.toUpperCase());
}
}
.
谁能告诉我有什么问题吗?