[SPRING] Spring : @Resource injection이 JDK9에서 작동을 멈췄다.
SPRINGSpring : @Resource injection이 JDK9에서 작동을 멈췄다.
내 @Configuration 클래스에서 나는 다음과 같은 의존성을 가지고있다 :
@Configuration
public class MyConfig {
@Resource(name = "firstDataSource")
private DataSource firstDataSource;
// more code
}
종속성 삽입은 Oracle JDK 8에서 작동했습니다. firstDataSource 필드에 null이 아닌 값이 성공적으로 주입되었습니다.
이제는 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)
의존성이 주입되지 않을 때 일어난다.
해결법
-
==============================
1.jdk9에서 더 이상 사용되지 않는 java.xml.ws.annotation이 당신이 직면 한 원인 일 수 있습니다. 주석 @Resource는 동일한 모듈에서 내 보낸 javax.annotation 패키지에 있습니다.
jdk9에서 더 이상 사용되지 않는 java.xml.ws.annotation이 당신이 직면 한 원인 일 수 있습니다. 주석 @Resource는 동일한 모듈에서 내 보낸 javax.annotation 패키지에 있습니다.
javax.annotation을 내보내는 java.xml.ws.annotation의 업그레이드 가능한 모듈로 javatm-common-annotations를 제공하고자 할 수 있습니다.
중앙 검색에서 다음과 같이 사용할 수 있음을 나타냅니다.
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.1</version> </dependency>
내 컴퓨터에서 공유 코드로 잘 돌아갑니다.
또한 공유 한 코드에 대한 메모입니다. JDK9를 사용하기 때문에, 28-9-2017에 릴리스 된 최신 springframework 의존성을 사용하여 마이그레이션해야합니다.
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.0.RELEASE</version> </dependency>
편집 : javaee explosed 모듈로 아직 마이그레이션하지 않으려는 경우에 대비하여 --add-modules를 사용하기위한 대체 프로그램에 대한 Roman의 대답을 살펴보십시오.
-
==============================
2.누락 된 세부 정보 추가.
누락 된 세부 정보 추가.
Spring @ Resource-driven injection은 런타임시 javax.annotation.Resource를 사용할 수있는 경우에만 작동합니다. Spring이 확인합니다.
private static final boolean jsr250Present = ClassUtils.isPresent("javax.annotation.Resource", AnnotationConfigUtils.class.getClassLoader());
jsr250Present 변수를 사용하여 @ Resource 기반 주입 (@ PostConstruct / @ PreDestroy 기능)을 활성화해야하는지 확인합니다.
필자의 경우, JDK 9에서이 클래스는 런타임에 사용할 수 없었습니다. java.lang을 포함하는 기본 java.base 모듈과 항상 다른 패키지가 아닌 별도의 모듈 인 java.ws.xml.annotation에 속하기 때문입니다 유효한). 이 문제를 해결하기 위해 다음 방법 중 하나를 사용할 수 있습니다.
from https://stackoverflow.com/questions/46494522/spring-resource-injection-stopped-working-under-jdk9 by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 자바 9 모듈은 A와 B로부터 패키지 X를 읽는다. (0) | 2019.01.19 |
---|---|
[SPRING] 오리진 서버는 대상 자원에 대한 현재 표현을 찾지 못했거나 공개하려고하지 않습니다. 바람둥이에 배치에 (0) | 2019.01.19 |
[SPRING] Spring Data JPA - json 직렬화를위한 ZonedDateTime 형식 (0) | 2019.01.19 |
[SPRING] 스프링 부트 1.2에서 1.5.2로 업그레이드 한 후, Tomcat 8.5 시동시 FileNotFoundException을 업그레이드 한 후 (1) | 2019.01.19 |
[SPRING] "가장 먼저 10 * FROM T"구문을 사용할 수있는 휴대용 방법이 있습니까? (0) | 2019.01.19 |