带有JSR 303的ConstraintValidator无法正常工作

时间:2016-11-12 07:02:31

标签: validation spring-mvc hibernate-validator

嗨我在使用ConstraintValidator实现自定义验证时遇到了问题。

我正在使用JSR303constraint validator实现一些bean验证,现在我已经实现了

@ProductId// this is the problem
    @NotEmpty(message = "{Domain.NotEmpty.productid}")
    protected String productId;

    @Pattern(regexp = "[A-Za-z]+", message = "{Domain.Pattern.firstName}")
    ....

@ProductID

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE })
@Documented
@Constraint(validatedBy = ProductIdValidator.class)
public @interface ProductId {
    String message() default "{ProductId.validaton.Error}";

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

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

ProductIdValidator

public class ProductIdValidator implements ConstraintValidator<ProductId, String> {

    @Autowired
    private RepositiryObject repo;

    @Override
    public void initialize(ProductId productId) {

    }

    @Override
    public boolean isValid(String string, ConstraintValidatorContext constraintValidatorContext) {

        Domain domain;
        try {
            domain = repo.getProductById(string);
        } catch (ProdctNotFoundException ex) {
            return true;
        }
        if (domain != null) {
            return false;
        }
        return true;
    }

}

栈跟踪

Request processing failed; nested exception is javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.] with root cause
java.util.NoSuchElementException: No value present
    at java.util.Optional.get(Optional.java:135)
    at com.model.domain.controller.repo.RepositiryObject.getProductById(RepositiryObject.java:45)
    at com.java.spring.custom.validation.annotations.constraints.ProductIdValidator.isValid(ProductIdValidator.java:28)
    at com.java.spring.custom.validation.annotations.constraints.ProductIdValidator.isValid(ProductIdValidator.java:1)
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:448)
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:127)
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:87)
    at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:73)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:617)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:580)

DispatcherServlet的

<mvc:annotation-driven validator="validator" />
<bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource" />
    </bean>

...

编辑由于异常表示不存在此类元素,但当我运行测试时,其工作正常

 public RepositiryObject() {
            domainList = new ArrayList<>();

            Domain domain = new Domain();
            domain.setProductId("P1234");

            domainList.add(domain);

        }
@Test
    public void checkIfProductExists() {

        Assert.assertEquals("P1234", domainList.stream().filter(product -> product.getProductId().equals("P1234"))
            .map(Domain::getProductId).findAny().get());
    }

现在的问题是当我删除@ProductId时,它工作得很好,不知道我在这里缺少什么

0 个答案:

没有答案