【问题标题】:How to use Bean Validation 2.0 (JSR 380) features in Tomcat 8?如何在 Tomcat 8 中使用 Bean Validation 2.0 (JSR 380) 功能?
【发布时间】:2019-08-02 22:21:16
【问题描述】:

Bean Validation 2.0 (JSR 380) 应该能够执行以下验证:

@Valid
public class MyBean{
  private List<@NotNull String> members;
}

但它似乎只是忽略了@NotNull 注释。此外,@NotBlank@NotEmpty 注释将被忽略。

我通过 Maven 在我的类路径中有 Bean Validation 2.0 API 和参考实现:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.15.Final</version>
</dependency>

我在 Jersey 中使用 Java 8 和 Tomcat 8。

我是否需要以某种方式配置 Tomcat 以使用 2.0 实现,而不是捆绑在 JDK 8 中的默认实现(例如在 Jackson 中启用 Optional&lt;&gt; 支持)?

【问题讨论】:

标签: java hibernate tomcat bean-validation


【解决方案1】:

问题的原因是 Jersey 的 Bean Validation 扩展隐含地带来了旧版本的 Hibernate 验证器,而我在 pom.xml 中明确请求的 Hibernate 验证器没有被使用。

为了解决这个问题,我排除了 Jersey 隐式拉取的休眠验证器:

<dependency>
            <groupId>org.glassfish.jersey.ext</groupId>
            <artifactId>jersey-bean-validation</artifactId>
            <version>2.27</version>
            <exclusions>
                <exclusion>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-validator</artifactId>
                </exclusion>
            </exclusions>
 </dependency>

添加我的 Bean Validation 版本

     <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.15.Final</version>
    </dependency>

并添加了 Java EL:

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.1-b09</version>
    </dependency>

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
        <scope>test</scope>
    </dependency>

【讨论】:

    【解决方案2】:

    您是否尝试将@Valid 注释添加到应执行验证的类/字段中?

    根据我的经验,出于某种原因,必须存在此注释才能执行验证。

    【讨论】:

    • 是的。它没有帮助。我会把它添加到问题中。
    【解决方案3】:

    您似乎缺少EL 实现,请尝试添加此依赖项:

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.1-b09</version>
    </dependency>
    

    【讨论】:

    • 感谢@Matteo Baldi,Java EL 确实不见了。
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2022-06-29
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多