当前位置: 首页 > 面试题库 >

春季:@Resource注入在JDK9下停止工作

陈铭晨
2023-03-14
问题内容

在我的@Configuration课堂上,我有如下依赖性:

@Configuration
public class MyConfig {
    @Resource(name = "firstDataSource")
    private DataSource firstDataSource;

    // more code
}

依赖项注入在Oracle JDK 8中工作:firstDataSource字段已成功注入非空值。

现在,我尝试在JDK 9中运行该应用程序(不做任何修改)。结果是@Resource不再触发依赖项注入:用此注释注释的所有内容都保留了null

@Resource停止工作的原因可能是什么?

在项目中使用Spring 4.0.9。

这是一个演示该问题的测试项目:https :
//github.com/rpuch/test-spring-injection-jdk9

它包含一个测试:MainTest我从我的IDE运行。当我使用JDK 8时,它输出

сен 29, 2017 10:45:13 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5f8ed237: startup date [Fri Sep 29 22:45:13 SAMT 2017]; root of context hierarchy
OK

但是在JDK 9下,它会在启动期间引发异常,这是由以下原因引起的:

Caused by: java.lang.IllegalStateException: bean1 is not injected
    at Bean2.<init>(Bean2.java:7)
    at Config2.bean2(Config2.java:16)

当没有注入依赖项时会发生这种情况。


问题答案:

java.xml.ws.annotation在jdk9过时的存在可能是你所面对的原因。由于注释@Resource来自javax.annotation同一模块导出的包。

您可能需要提供javatm-common-
annotations
作为可升级模块,
java.xml.ws.annotation 并为其导出javax.annotation。

Java™通用注释的独立发行版使用Java平台模块系统“自动”模块名称java.annotation来匹配JDK 9中使用的模块名称。

中央搜索提示,您可以使用:-

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

使用共享代码在我的机器上运行良好。

另外,有关共享代码的注释。由于要迁移到使用JDK9,因此应迁移到使用2017年9 月28日发布的最新springframework依赖项:-

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.0.RELEASE</version>
</dependency>

编辑 :请看一下
Roman的答案,--add- modulesjavaee备不时之需。



 类似资料:
  • 问题内容: 最简单的例子: 我已经配置了一个调度程序servlet来捕获所有内容: 我有一个简单的测试控制器: 在这个测试用例中,我将以下行添加(或删除)到: 我的远大目标: 提供静态内容(图像,css,js)以及动态内容(通过Jetty servlet容器内的Velocity生成,与全能的Spring捆绑在一起)。 我的Dilema: 添加时得到404 ,但是我可以从http://localho

  • 问题内容: 我想以不在Bean中对Spring创建依赖项的方式注入类路径资源的URL。意味着,bean不应该使用Spring的接口/类。我怎样才能做到这一点? 问题答案: Spring能够将值隐式转换为: 。

  • 问题内容: 我喜欢基于构造函数的注入,因为它允许我进行注入的字段。我还喜欢注释驱动的注入,因为它简化了我的操作。只要没有两个相同类型的参数,就可以用标记构造函数,并且一切正常。例如,我有一个课: 以及具有以下内容的应用程序上下文: 应该有一种在类的构造函数上指定bean ID的方法,但是我在文档中找不到它。是否有可能,或者我是否梦想着不存在的解决方案? 问题答案: 是按类型(在这种情况下);用于按

  • 问题内容: 我有一个非常简单的抽象类 现在您可以看到,我正在尝试自动连接DatabaseModel。但是在我的扩展类中,我只为dbModel接收null。 问题:我在这里尝试一些不可能的事情吗? 问题答案: 您的设置似乎很好。原因也许在其他地方。也许您正在使用实例化该类,而不是让spring这样做。

  • 问题内容: 我有一个Java应用程序,它从主类开始(不是Spring Boot应用程序)。而且我想使用Spring retry在连接丢失时重试。据我所知,我需要在Spring应用程序的主类之上添加@EnableRetry批注,然后在我的方法之上使用@Retryable进行重试。但是我认为这在非​​Spring应用程序中将不起作用。是否可以在简单的Java应用程序(而非spring应用程序)中使用s

  • 问题内容: 我有一堂课: 配置文件 我如何将其注入一些构造函数,即: 我希望此字符串具有从Config注入的值。那可能吗? 问题答案: 您将必须命名Bean,然后在自动装配引用该名称时使用注释。 例: 配置文件 SomeC.java