maven JetBrains' @NotNull仅在从IDEA生成项目时有效

6rvt4ljy  于 2022-12-11  发布在  Maven
关注(0)|答案(4)|浏览(386)

我写了一个简单的项目来学习如何使用注解验证。为此我添加了Maven依赖项(我也尝试了javax.validation,它对我不起作用):

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations</artifactId>
    <version>15.0</version>
</dependency>

并这样使用它:

public boolean add(@NotNull T entry){ ...

当我从IDEA构建项目时,一切都很好,但是当用maven命令编译代码时,它就不工作了。在反编译的类文件中,我注意到IDEA以不同的方式编译我的类。它添加了以下检查:

if (entry == null) {
    $$$reportNull$$$0(0);
}

而梅芬却没有。
我做错了什么吗?请告诉我应该如何使用它(无论是jetbrains还是javax验证)。

slwdgvem

slwdgvem1#

此处部分猜测:你看,不是“IDEA”把额外检查放入字节码。
问题是:注解也可以用来生成代码(更多阅读请参见here)。代码生成的核心是:这个注解需要一个javax.annotation.processing.Processor类。2编译器会用这个类把源代码注解转换成字节码中合理的东西。
如果我没猜错的话,您没有为Maven编译设置好这些javax部分。因此解决方案是修复您的Maven设置以提供所有必需的依赖项。

wsxa1bj1

wsxa1bj12#

您的@NotNull注解似乎是IntelliLang插件的一部分,旨在支持IDEA中的编码(即有助于合同编码)。我怀疑它是否在IDEA之外可用。
在开始使用语言注入之前,请确保IntelliLang插件已启用。该插件与IntelliJ IDEA捆绑在一起,并且默认情况下处于激活状态
我不太了解,所以请向推荐人问好
另一方面,javax.validation的设计用途完全不同,它通过Bean Validation从java EE检查数据对象内容是否有效

b4qexyjb

b4qexyjb3#

创建了一个Maven插件,用于为Maven构建执行相同的操作:
https://github.com/osundblad/intellij-annotations-instrumenter-maven-plugin
默认情况下,它仅适用于JetBrains注解。

ogq8wdun

ogq8wdun4#

正如其他回答所指出的,Intellij实现了一个过程,在编译代码之前将空值检查添加到代码中。有一个非官方的maven插件(https://github.com/osundblad/intellij-annotations-instrumenter-maven-plugin)和它的一些分支,但它不再维护(最后一次更改是在一年多以前),我无法让它工作。
因此,我建议使用另一个注解。在我的项目中,我改用了Lombok,它也有一些不错的附加特性。要让它工作,你需要显式地告诉Lombok抛出另一个异常。请看下面的工作示例:

先决条件:

您需要将lombok依赖项添加到maven pom.xml(查找最新版本here):

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

在根目录(在包含“src”的文件夹内)中创建一个包含以下内容的lombok.config:

lombok.nonNull.exceptionType=IllegalArgumentException

1.用例

现在您可以使用@NonNull注解来表示参数,空值检查将自动生成。您可能还需要将maven-surefire-plugin添加到pom.xml中。

2.用例

当空值检查是必要的而不是构造函数的时候,有一个很好的可能性让Lombok自己解决问题。下面的代码将生成一个带有两个参数的构造函数(list 1,list 2)。但是如果参数'list 1'是null,它只会抛出IllegalArgmentException/NullPointerException,因为list 2没有用@NonNull注解。

import lombok.RequiredArgsConstructor;
import java.util.List;

@RequiredArgsConstructor
public class A {

    @NonNull
    private final List<String> list1;

    private final List<String> list2;
    
    ...
}

相关问题