@Valid没有抛出异常

时间:2015-09-16 14:18:58

标签: java hibernate jersey bean-validation jersey-2.0

我正在尝试使用@Valid来验证我的JPA实体:

public static void persist(@Valid Object o)

它运作良好一段时间,但现在它停止工作,我不知道为什么。我试图在persist方法中手动完成它,它按预期工作:

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    Set<ConstraintViolation<Object>> constraintViolations = validator.validate(o);

    if (!constraintViolations.isEmpty()) {
        throw new ConstraintViolationException(constraintViolations);
    }

可能发生什么或如何调试?

2 个答案:

答案 0 :(得分:4)

方法验证仅在bean验证v 1.1(例如hibernate validator 5.x impl)中开始提供,它仅是Java EE 7的一部分。除此之外,如果没有额外的特定BV代码,您的方法必须是与bean验证集成的组件的一部分(例如CDI Beans,JAX-RS Resource)。您的自定义代码有效,因为您不使用方法验证,而是直接在对象上定义的BV约束。

答案 1 :(得分:1)

不会在任意服务上工作。在泽西岛,它只适用于资源方法。因此,在资源方法中验证传入的DTO。

@POST
public Response post(@Valid SomeDTO dto) {}

Bean Validation Support

了解详情

更新

因此,为了回答OP关于如何使其适用于任意服务的评论,我创建了一个小项目,您可以将其插入到应用程序中。

  

您可以在GitHub (jersey-hk2-validate)找到它。

请查看项目中的测试。你也会在那里找到一个完整的JPA例子。

用法

克隆,构建并添加Maven项目

public interface ServiceContract {
    void save(Model model);
}

public class ServiceContractImpl implements ServiceContract, Validatable {
    @Override
    public void save(@Valid Model model) {}
}

然后使用ValidationFeature绑定服务

ValidationFeature feature = new ValidationFeature.Builder()
        .addSingletonClass(ServiceContractImpl.class, ServiceContract.class).build();
ResourceConfig config = new ResourceConfig();
config.register(feature);

关键是要使您的服务实施实施Validatable

实施细节在README中。但它的要点是它使用HK2 AOP。因此,您的服务需要由HK2管理才能运作。这就是ValidationFeature为你做的事情。