我不能在 Java 11 中使用 @PostConstruct 和 @PostDestroy

Posted

技术标签:

【中文标题】我不能在 Java 11 中使用 @PostConstruct 和 @PostDestroy【英文标题】:I can't use @PostConstruct and @PostDestroy with Java 11 【发布时间】:2019-03-13 01:50:49 【问题描述】:

在我的项目中使用@PostConstruct@PostDestroy 注释时遇到问题。我不能使用这些注解,尽管我导入了 Java 的注解,但看起来这些注解并不存在。我正在使用 Java 11,这是我的 build.gradle 文件的内容:

dependencies 
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.springframework', name: 'spring-webmvc', version: '5.1.0.RELEASE'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.7'
    compile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2'
    provided group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1' 

【问题讨论】:

【参考方案1】:

请注意,@PostConstruct@PreDestroy 注释都是 Java EE 的一部分。由于 Java EE 在 Java 9 中已被弃用并在 Java 11 中被删除,我们必须添加一个额外的依赖项才能使用这些注解:

对于 Maven

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

如果使用 Gradle

implementation "javax.annotation:javax.annotation-api:1.3.2"

在这里找到:https://www.baeldung.com/spring-postconstruct-predestroy

【讨论】:

供参考,gradle:implementation "javax.annotation:javax.annotation-api:1.3.2"【参考方案2】:

你只有 spring-webmvc,你需要 spring 的其余部分才能使用它们的注解。可能是 spring-core 和 spring-annotations。

【讨论】:

谢谢!这是我的问题的原因。 解决方案没有任何意义,因为@PostConstruct 不是弹簧注释。 @unwichtich 我不同意,这完全有道理。确实这些是 javax.annotation,但是 spring 可以提供这些注释,并且可以从这个问题的上下文中推断出 OP 正是想要这种行为。是的,我可以在这里与 OP 进行长时间的讨论,但也许他只是忘记了弹簧是分开的,而不是一个罐子? 啊,好吧,我忽略了 OP 只导入了 API 包并且缺少实现。你是对的!【参考方案3】:

另一个对我有用的解决方案是这个。 转至https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api/1.2 并下载jar文件。 然后将 jar 文件复制到您的项目 lib 目录。 最后将项目构建路径指向您粘贴到本地 lib 文件夹中的文件的类路径下。

【讨论】:

以上是关于我不能在 Java 11 中使用 @PostConstruct 和 @PostDestroy的主要内容,如果未能解决你的问题,请参考以下文章

我不能在 Java 11 中使用 @PostConstruct 和 @PostDestroy

为啥使用@PostConstruct?

为啥我不能在 java 中使用 SimpleDateFormat 得到正确的年份?

为啥我们不能在(非静态)内部类(Java 16 之前)中使用静态方法?

多个类中 使用@PostConstruct,加载先后顺序

Android ProgressDialog 不能与 AsyncTask 一起使用