복붙노트

[SPRING] Spring : @Resource injection이 JDK9에서 작동을 멈췄다.

SPRING

Spring : @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. ==============================

    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. ==============================

    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에 속하기 때문입니다 유효한). 이 문제를 해결하기 위해 다음 방법 중 하나를 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/46494522/spring-resource-injection-stopped-working-under-jdk9 by cc-by-sa and MIT license