我正在尝试使用@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
为您执行的操作。