在我的@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- modules
以javaee
备不时之需。
问题内容: 最简单的例子: 我已经配置了一个调度程序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