我正在尝试为 REST API 创建自定义 bean 验证,但由于某种原因,“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 {};
}
validator :
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());
}
}
.
谁能告诉我问题出在哪里?
最佳答案
您的所有代码看起来都不错。使用提供的代码,我已成功使用此调用 validator (使用 Jersey):
@POST
public Response getTest(TestRest testRest) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<TestRest>> constraintViolations = validator.validate(testRest);
System.out.println(constraintViolations.size());
return Response.status(Response.Status.OK).entity(constraintViolations.size()).build();
}
希望这有帮助。
关于java - 自定义 Bean 验证不适用于多个 Bean 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47412448/