Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @无效,不引发异常_Java_Hibernate_Jersey_Bean Validation_Jersey 2.0 - Fatal编程技术网

Java @无效,不引发异常

Java @无效,不引发异常,java,hibernate,jersey,bean-validation,jersey-2.0,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(

我试图用@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);
    }
ValidatorFactory=Validation.buildDefaultValidatorFactory();
Validator Validator=factory.getValidator();
设置constraintViolations=validator.validate(o);
如果(!constraintViolations.isEmpty()){
抛出新的ConstraintViolationException(constraintViolations);
}

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

方法验证只在bean validation v1.1(例如impl)中提供,它只是JavaEE7的一部分。除此之外,要使其在没有额外特定BV代码的情况下工作,您的方法必须是与bean验证集成的组件的一部分(例如CDIBeans、JAX-RS资源)。您的自定义代码之所以有效,是因为您不使用方法验证,而是使用直接在对象上定义的BV约束。

无法在任意服务上工作。在Jersey中,它仅适用于资源方法。因此,在资源方法中验证传入的DTO

@POST
public Response post(@Valid SomeDTO dto) {}
更多信息请访问


更新 因此,为了回答OP关于如何使其在任意服务上工作的评论,我创建了一个小项目,您可以在应用程序中即插即用

你可以在电视上找到它

请看项目中的测试。你也可以在这里找到一个完整的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);
关键是让您的服务实现实现


实现的细节在自述文件中。但它的要点是它利用了。因此,您的服务需要由HK2管理,才能正常运行。这就是
ValidationFeature
为您所做的。

这似乎是正确的答案,但您能否详细说明“您的方法必须是与bean验证集成的组件的一部分”部分?或者给我指点书?谢谢您是否在JavaEE管理的环境(wildfly、websphere、GF…)中使用BV?如果是,则检查服务器符合的JavaEE版本。如果是JavaEE7,那么我建议使用CDI并在这种组件中声明您的方法。我们在Java8VM中使用Jersey+Grizzly。我相信JavaBean验证正在工作,所以我猜JavaEE版本>=7。我将尝试您的建议并使用CDI(但首先,要了解它是如何工作的)。Grizzly不是一个Java EE兼容的服务器,根据本文,它似乎甚至不符合Servlet规范:。Grizzly网站(),只提到它不完全符合Servlet规范-没有提到任何关于JavaEE的内容-你在哪里读到的?听起来不错,之前我成功地验证了传入的DTO。但我们的问题是:DTO和(生成的)实体对象上的重复约束。知道如何解决这个问题吗?我有一个理论,这样你就不必重复上面的显式验证代码,但我现在没有时间实现和测试它。也许过一会儿我会发布我的发现,如果成功的话。太好了!我很期待。看看更新和GitHub项目:-)哇,太棒了!我仍在浏览您的代码以了解您所做的工作,但我有一个问题:使用@Valid而不是像我这样进行“手动”验证有什么好处?谢谢你的帮助!