代码之家  ›  专栏  ›  技术社区  ›  Pascal

自定义Bean验证不适用于多个Bean类

  •  0
  • Pascal  · 技术社区  · 7 年前

    我正试图为我的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());
        }
    }
    
                                           .
    

    谁能告诉我有什么问题吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   SirCipher    7 年前

    所有代码看起来都正常。使用提供的代码,我成功地使用以下代码调用了验证器(使用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();
    }
    

    希望这有帮助。