当前位置: 首页 > 知识库问答 >
问题:

@Valid未引发异常

冯和硕
2023-03-14

我正在尝试使用@Valid验证我的JPA实体,如下所示:

public static void persist(@Valid Object o)

它工作了一段时间,但现在它停止工作,我不知道为什么。我试着在< code>persist方法中手动执行,它按预期工作:

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

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

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

可能会发生什么情况,或者我该如何调试?

共有2个答案

解阳荣
2023-03-14

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

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

查看Bean验证支持的更多信息

因此,为了回答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

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

公羊浩气
2023-03-14

方法验证只在bean validation v 1.1(例如hibernate validator 5.x impl)中可用,它只是Java EE 7的一部分。最重要的是,要让它在没有额外的特定BV代码的情况下工作,您的方法必须是与bean验证集成的组件的一部分(例如,CDI Beans,JAX-RS资源)。您的自定义代码可以工作,因为您不使用方法验证,而是使用直接在对象上定义的BV约束。

 类似资料:
  • 我正在使用Spring In Action 3 Action学习Spring MVC,我已经实现了显示用户注册表的基本程序,一旦我们提交表单,它将使用进行验证。 这是我的Spring控制器: 这是我的Spitter类文件: 这是我的编辑。显示给用户注册的jsp文件: 要加载表单,我将访问URL为:,一旦表单被加载,我只需提交表单而无需输入任何详细信息,以便我可以检查我的表单是否得到验证。但是我得到

  • 我正在使用Jooq将CSV数据填充到我的数据库中。如果我提供“字符串值”而不是Int,它不会将值输入数据库,但同时也不会抛出错误。我如何知道上传是否失败。如何处理这些类型的异常。此外,如果我尝试在int列中给出字符串,有没有办法检查/抛出警告。 版本:3.8.x

  • 问题内容: 在我的使用Mockito的单元测试中,我想验证未抛出该异常。 我的测试设置了,设置了对象和属性,以便该方法将抛出。 我 确认 从未调用过Calling.method()。 我想要测试失败,因为它抛出,然后我想编写一些代码来解决此问题。 我注意到的是,测试始终会通过,因为永远不会抛出异常。 问题答案: tl; dr JDK8之后:使用 AssertJ 或自定义lambda来声明 异常 行

  • 我正在使用Mockito来模拟服务层的方法。 试图嘲笑以下代码行 为了嘲笑我正在使用的这个 但问题是当代码到达行

  • java.lang.AssertionError:预期测试将在org.junit.Assert.Fail(Assert.java:88)在org.junit.rules.ExpectedException.FailduetOmissingException(ExpectedException.java:263)在org.junit.rules.ExpectedException.Access$20

  • 我用Spring5反应式编写了一个自定义异常 我把这个叫做服务: 但是当我到达这个页面时,会抛出一个异常,但它不是404,而是一个空指针异常和一个错误500页面,但有正确的消息? AddressNotFound永远不会抛出,只有Nullpointer异常,但会抛出我的自定义消息???你能帮帮我吗? 这是我的控制器: 谢谢