在 Java 中,使用 @NonNull 注释的属性验证对象的最佳方法

in Java, best way to validate objects with properties annotated with @NonNull

我正在 Java 中实现一个 API 网关,其中请求对象有很多字段和子对象。有许多属性是 required(不应为空),有些属性是可选的。

Karaf 中的代码 运行s 并且正在使用蓝图,因此一些基于 Spring 的机制是可能的,但我们现在没有使用太多来自 Spring 的内容(尽管我熟悉各种 Spring 框架)。

我知道 Eclipse @NonNull 注释,我可以将该注释添加到 getter 需要 return 非空值的方法。

我希望能够做的是 运行 请求对象上的一个可重用方法,它将确定是否存在任何约束违规和 return 一个人类可读的错误消息 (或其他东西)。

似乎有多种方法可以做到这一点,但我不确定哪种框架策略对我的情况有意义。例如,有 commons-validator,但这似乎是特定于网页表单的。我还看到了一些关于 hibernate validator 的文档,但这似乎不适用于此处。

您可以使用 oracle Validation API JSR-303,它是独立的框架,可用于基于 Web 和 none 基于 Web 的应用程序,Hibernate 为该 JSR-303 提供了实现. 您可以在 pom.xml 文件

中包含如下依赖项
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

和实施

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>5.2.1.Final</version>
</dependency>

在您的 bean 对象中,您可以使用像 @NotEmpty@NotNull@Range .... 这样的注释 您也可以根据需要配置每个注释,例如,您可以将自定义消息添加到 @NotNull 注释,如

@NotNull(message = "First Name cannot be null")
private String firstName;

要使验证正常工作,只需使用 @Valid 注释实体并将另一个参数添加到 BindingResult

类型的控制器方法中
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser(@Valid User user, BindingResult result) {

        if (result.hasErrors()) {
            return "errorPage";
        } else {
            return "Done";
        }
    }