【问题标题】:Jackson Conditional Validation of a field字段的杰克逊条件验证
【发布时间】:2016-09-26 21:02:10
【问题描述】:

我正在尝试在 Spring 上使用以下结构设置 Range Query 结构:

public class QueryRange extends Query {

    @JsonProperty(required = true)
    @NotBlank
    @NotNull
    private String field;

    private Object gt;

    private Object gte;

    private Object lt;

    private Object lte;

    public String getField() {
         return field;
    }

    public QueryRange setField(String field) {
        this.field = field;
        return this;
    }

    public Object getGt() {
        return gt;
    }

    public QueryRange setGt(Object gt) {
        this.gt = gt;
        return this;
    }

    public Object getGte() {
        return gte;
    }

    public QueryRange setGte(Object gte) {
        this.gte = gte;
        return this;
    }

    public Object getLt() {
        return lt;
    }

    public QueryRange setLt(Object lt) {
        this.lt = lt;
        return this;
    }

    public Object getLte() {
        return lte;
    }

    public QueryRange setLte(Object lte) {
        this.lte = lte;
        return this;
    }

    @AssertTrue(message = "Invalid range. A value for 'gt' or 'lt' should be set.")
    private boolean isRangeSpecified() {
        return this.gt != null || this.lt != null;
    }

    @AssertTrue(message = "Invalid range data type. 'gt' and 'lt' must be of the same type.")
    private boolean isRangeDataTypeValid() {
        if (this.gt != null && this.lt != null) {
            return this.gt.getClass().equals(this.lt.getClass());
        }

        return true;
    }
}

问题是 gt、gte、lt 或 lte 值中的至少一个不应为空。如何验证?

我在上面的代码示例中尝试过 Bean Validation,但它不起作用。有什么建议吗?

【问题讨论】:

    标签: java spring jackson json-deserialization


    【解决方案1】:

    您应该使用Class-level 约束。

    最后但并非最不重要的一点是,也可以在类级别上放置一个约束。在这种情况下,验证的对象不是单个属性,而是完整的对象。如果验证依赖于对象的多个属性之间的相关性,则类级别的约束很有用。

    @ValidQueryRange
    public class QueryRange extends Query {
        // your class here...
        private Object gt;
    
        private Object gte;
    
        private Object lt;
    
        private Object lte;
    }
    

    @Target({ TYPE, ANNOTATION_TYPE })
    @Retention(RUNTIME)
    @Constraint(validatedBy = { ValidQueryRangeValidator.class })
    @Documented
    public @interface ValidQueryRange {
    
        String message() default "{error}";
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    }
    

    public class ValidQueryRangeValidator implements ConstraintValidator<ValidQueryRange, QueryRange> {
    
        @Override
        public void initialize(ValidQueryRange constraintAnnotation) {
        }
    
        @Override
        public boolean isValid(QueryRange queryRange, ConstraintValidatorContext context) {
            if ( queryRange == null ) {
                return true;
            }
            // put your logic here
            if ( queryRange.getGt() == null || queryRange.getLt() == null) {
                return false;
            }
    
            return true;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 2014-10-15
      • 2016-12-14
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多