提问人:ilhan 提问时间:10/18/2023 最后编辑:ilhan 更新时间:10/19/2023 访问量:159
我应该如何防止 Java 中的负整数?
How should I prevent negative integers in Java?
问:
我有一个带有整数参数的方法,我想只允许正整数或非负整数。实现此限制的最佳方法是什么?我尝试过注释,但它们不起作用。
如果它是负数,我希望它抛出异常。
public List<UserEntity> findUsersCreatedInTheLast(@NonNull @Min(value = 0) @Valid @Positive Integer minutes) {
答:
3赞
Anish B.
10/18/2023
#1
我猜你在项目中使用了依赖项,我怀疑你正在尝试使用 JSR-303 注解来验证。hibernate-validator
您必须使用方法来启用方法参数验证并使 JSR-303 注解在 Spring 中工作。@Validated
演示的示例代码:
import jakarta.validation.constraints.PositiveOrZero;
import org.springframework.validation.annotation.Validated;
@Validated
public class UserDAO {
public List<UserEntity> findUsersCreatedInTheLast(@NonNull
@PositiveOrZero Integer minutes) {
// logic
}
}
当传递负数时,这将抛出这样的异常:
jakarta.validation.ConstraintViolationException: findUsersCreatedInTheLast.minutes:必须大于或等于 0
注意:使用批注。使用时间要短得多。@PositiveOrZero
更新:
我的pom.xml用于测试:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-boot-mysql</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-mysql</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
只需将这些依赖项添加到您的 Spring Boot 应用程序即可。
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
</dependency>
我已经测试过了。这将 100% 有效。
评论
0赞
ilhan
10/19/2023
它说“无法创建配置,因为找不到 Jakarta Bean 验证提供程序。将像 Hibernate Validator (RI) 这样的提供程序添加到您的类路径中“,然后在我添加一些依赖项后,它说”HV000183:无法初始化'jakarta.el.ExpressionFactory'”。我要放弃了。在我看来,它仅在某些条件下有效。
0赞
Anish B.
10/19/2023
@ilhan 添加 hibernate-validator 依赖项。
0赞
Anish B.
10/19/2023
@ilhan<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
0赞
Anish B.
10/19/2023
@ilhan 编号它有效。我不知道你在做什么。但如果你愿意,我可以通过 github 提供一个代码示例
0赞
Anish B.
10/19/2023
@ilhan我正在用绒球更新我的答案.xml
评论
if (minutes == null || minutes < 0) { throw new IllegalArgumentException(); }
应该这样做。但是,如果不能,那么它真的应该是(或者更好的是:)。null
int minutes
Duration duration
hibernate-validator
@validated
@service