我正在尝试使用@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);
}
可能发生什么或如何调试?
答案 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) {}
了解详情
因此,为了回答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
为你做的事情。