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

标签 java validation javabeans

我正在尝试为 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/

相关文章:

java - 为什么我在线程 "AWT-EventQueue-2"java.lang.NoClassDefFoundError 中遇到异常?

Java 自省(introspection)/反射复制 bean

java - 使用 Spring bean 在 JSF 1.2 中模拟 jsf 2.0 View 范围

java - 使用异常处理 Java REST API 的应用程序和业务故障场景

wpf - 当出现验证错误时,防止失去 TextBox 焦点的最佳方法是什么?

java - Java 1.7 (Windows) 中的文本抗锯齿失效

python - fit_generator() 以最小的验证损失保存模型

node.js - 向 Express 模型添加方法

java - 使用 Java 将记录插入 Oracle DB

Java 接口(interface)函数返回实现它的类