我正在尝试使用@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);
    }


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

最佳答案

不适用于任意服务。在Jersey,它仅适用于资源方法。因此,请在您的资源方法中验证传入的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为您执行的操作。

10-08 15:01