当注释bean在另一个bean中用作集合时,自定义约束验证器不起作用

时间:2017-11-16 08:03:18

标签: java spring validation

我正在使用Spring启动创建休息服务并验证我的DTO,我使用的是java验证API。

在某些DTO中,我必须进行跨领域验证,因此我使用自定义验证器。

在我的DTO中,我必须检查重量 weight_unit 是否存在或两者都不存在。如果只有其中一个存在,那么我必须抛出验证错误。

如果我直接在另一个DTO中使用这个DTO但是当我将它用作DTO的集合时失败,它的效果非常好。它会抛出 org.springframework.beans.InvalidPropertyException

自定义验证器

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { ProductWeightValidatorImpl.class })
public @interface ProductWeightValidator {

    String message() default "{com.inventory.validator.ProductWeightValidator.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

自定义验证程序实现

public class ProductWeightValidatorImpl implements ConstraintValidator<ProductWeightValidator, ProductDTO> {

    @Override
    public void initialize(ProductWeightValidator constraintAnnotation) {

    }

    @Override
    public boolean isValid(ProductDTO product, ConstraintValidatorContext context) {
        return Objects.nonNull(product.getWeight()) && StringUtil.nullOrEmpty(product.getWeightUnit()) || Objects.isNull(product.getWeight()) && StringUtil.nonNullNonEmpty(product.getWeightUnit());
    }
}

应用验证程序的Bean

@ProductWeightValidator(message = "weight and weight_unit must be provided together")
public class ProductDTO extends BaseDTO {

    // other fields

    private Double weight;

    @JsonProperty("weight_unit")
    private String weightUnit;

    //getters and setters
}

将此bean用作集合的其他bean

public class ProductListDTO extends BaseDTO {

    @Valid
    private List<ProductDTO> products = new ArrayList<>(0);

    //getters and setters

}

现在,当我在请求中仅传递weight或weight_unit时,它会抛出异常 bean类[com.inventory.DTO.ProductListDTO]的无效属性'products []':属性路径'products []'中的索引无效

0 个答案:

没有答案