我应该如何防止 Java 中的负整数?

How should I prevent negative integers in Java?

提问人:ilhan 提问时间:10/18/2023 最后编辑:ilhan 更新时间:10/19/2023 访问量:159

问:

我有一个带有整数参数的方法,我想只允许正整数或非负整数。实现此限制的最佳方法是什么?我尝试过注释,但它们不起作用。

如果它是负数,我希望它抛出异常。

public List<UserEntity> findUsersCreatedInTheLast(@NonNull @Min(value = 0) @Valid @Positive Integer minutes) {
Java Spring-Boot 验证

评论

2赞 Andrei Lisa 10/18/2023
你能提供一个简单的生殖例子,上面的注释在你的情况下不起作用吗?
1赞 K.Nicholas 10/18/2023
过去,我们不得不在没有 IDE 的情况下编写代码行,同时每次都以两种方式向下移动页面。
1赞 Joachim Sauer 10/18/2023
if (minutes == null || minutes < 0) { throw new IllegalArgumentException(); }应该这样做。但是,如果不能,那么它真的应该是(或者更好的是:)。nullint minutesDuration duration
1赞 K.Nicholas 10/18/2023
@Min从何而来? ?如果是这样,是什么让你认为它属于某个随机方法参数?hibernate-validator
1赞 pdem 10/18/2023
@ihan让标签“bean-validation”与你使用的注解相关,还需要类的上下文,你需要和类:在这个例子中,验证在方法上太 stackoverflow.com/questions/42755608/ 了......@validated@service

答:

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