如何在 Tomcat 8 中使用 Bean Validation 2.0 (JSR 380) 功能?
How to use Bean Validation 2.0 (JSR 380) features in Tomcat 8?
Bean Validation 2.0 (JSR 380) 应该能够执行以下验证:
@Valid
public class MyBean{
private List<@NotNull String> members;
}
不过好像只是忽略了@NotNull注解。此外,@NotBlank
和 @NotEmpty
注释将被忽略。
我通过 Maven 在我的 class 路径中有 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>
我使用 Java 8 和 Tomcat 8 球衣。
我是否需要以某种方式配置 Tomcat
以使用 2.0 实现而不是 JDK 8 中捆绑的默认实现(例如在 [=17= 中启用 Optional<>
支持])?
您是否尝试将 @Valid 注释添加到您的 class/field 应该执行验证的地方?
根据我的经验,出于某种原因必须存在此注释才能执行验证。
您似乎缺少 EL
实现,请尝试添加此依赖项:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>
问题的原因是 Jersey 的 Bean 验证扩展隐含地带来了旧版本的 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 验证版本
<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>
Bean Validation 2.0 (JSR 380) 应该能够执行以下验证:
@Valid
public class MyBean{
private List<@NotNull String> members;
}
不过好像只是忽略了@NotNull注解。此外,@NotBlank
和 @NotEmpty
注释将被忽略。
我通过 Maven 在我的 class 路径中有 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>
我使用 Java 8 和 Tomcat 8 球衣。
我是否需要以某种方式配置 Tomcat
以使用 2.0 实现而不是 JDK 8 中捆绑的默认实现(例如在 [=17= 中启用 Optional<>
支持])?
您是否尝试将 @Valid 注释添加到您的 class/field 应该执行验证的地方?
根据我的经验,出于某种原因必须存在此注释才能执行验证。
您似乎缺少 EL
实现,请尝试添加此依赖项:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>
问题的原因是 Jersey 的 Bean 验证扩展隐含地带来了旧版本的 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 验证版本
<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>