복붙노트

[SPRING] WebSphere 7의 Spring (JSR 330 annotations)에 대한 종속성 삽입이 작동하지 않습니다.

SPRING

WebSphere 7의 Spring (JSR 330 annotations)에 대한 종속성 삽입이 작동하지 않습니다.

Java 6, Spring Framework 3.1.2 및 Mule-ESB 3.3.0으로 작성된 엔터프라이즈 응용 프로그램이이 질문과 관련이없는 다른 라이브러리에 있습니다.

우리의 빈과 서비스는 자동 컴포넌트 스캐닝과 의존성 주입 (EJB가없고 서비스 빈 만)을 위해 각각 @Named와 @Inject JSR-330 주석으로 선언된다. JBoss 4.2.3 (테스트 환경)에 배포하면 모든 것이 잘 동작합니다. 그러나 WebSphere 7에 배포 할 때 JSR-330 주석이 작동하지 않는 것처럼 보입니다. @Named로 표시된 빈은 전혀 감지되지 않습니다.

모든 것이 올바르게 구성되었음을 확신 할 수 있습니다 (JBoss에서 작동하고 있기 때문에). 특히 에는 base-package 속성이 올바르게 정의되어 있으며 scope-resolver 속성은 Jsr330ScopeMetadataResolver를 사용하도록 올바르게 구성되어 있습니다 (우리는 그것도없이 시도했습니다).

WebSphere 7 (7.0.0.23)이 이러한 종류의 주석을 지원하지 않을 수도 있음을 알고 있습니다. 아직 @Component 및 @Autowired Spring에 해당하는 테스트를 아직 수행하지 않았습니다. 안타깝게도 JSR 330 주석을 사용하고 싶기 때문에 Spring Framework를 사용하고 있지만 클래스에 직접 의존하지 않습니다.

그럼에도 불구하고, WebSphere 7이 JSR 330 주석을 지원하지 않는다는 명확한 진술을 찾고자하는 한 완전한 하루를 보냈지 만 지금까지 아무 것도 발견하지 못했습니다.

또한 Spring Framework가 application-context.xml 파일의 지시문을 통해 모든 작업을 수행하고 있다고 가정하기 때문에 왜 작동하지 않는지 알 수 없습니다.

누구든지이 문제에 약간의 빛을 가져올 수 있습니까?

WebSphere 7에서 주석을 통해 의존성 주입을 활성화하는 방법이 있습니까?

JSR 330 @Named / @Inject 주석에서 Spring 자신의 @Component로 다시 전환하면 @Autowired가 작동 할 가능성이 있습니까?

절망적 인 시도로 Spring의 ComponentScanBeanDefinitionParser를 확장하여 WebSphere 7에서도 JSR 330 주석을 감지 할 수 있습니까?

아무 것도 작동하지 않는다면 나는 결국 일반 XML 설정으로 돌아 간다. 그러나 XML에서 수 백개의 빈이 수동으로 구성되기 때문에 매우 바람직하지 않습니다.

해결법

  1. ==============================

    1.WebSphere 8을 사용할 올바른 버전 인 것 같습니다. EE6 (WebSphere 7은 EE5)을 지원하며 CDI 1.0 (JSR 299)을 포함합니다.

    WebSphere 8을 사용할 올바른 버전 인 것 같습니다. EE6 (WebSphere 7은 EE5)을 지원하며 CDI 1.0 (JSR 299)을 포함합니다.

    다음은 WebSphere 버전 인 JSR 299와 JSR 300 간의 관계를 요약 한 DeveloperWorks 스 니펫입니다

  2. ==============================

    2.Spring Framework의 Component Scan과 Autowire 기능을 모두 확장하여 해결 방법을 찾았습니다.

    Spring Framework의 Component Scan과 Autowire 기능을 모두 확장하여 해결 방법을 찾았습니다.

    먼저, @Named 주석이 스프링 컨테이너에 대한 탐지 및 등록에 적합하도록 Component Scanner에 포함 필터를 추가했습니다.

    <context:component-scan base-package="com.mycompany.mysystem">
        <context:include-filter type="annotation" expression="javax.inject.Named" />
    </context:component-scan>
    

    다음으로 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcesso r에 bean 정의를 추가하여 autowiring 적격성을 @Inject 어노테이션으로 확장했다.

    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
        <property name="autowiredAnnotationType" value="javax.inject.Inject" />
    </bean>
    

    초기에 @Named 및 @Inject 주석을 "다시 활성화"하는 데는 문제가 없었습니다. 그러나, 나는 아직도 autowire 후보자 해결 과정에서 콩을 충돌시키는 문제를 가지고있다. 이는 Spring과 JSR-330의 기본 해결 프로세스의 차이 때문이었습니다. 이 시나리오에서는 콩이 몇 개 밖에 없기 때문에 큰 문제는 아니 었습니다. 그것들은 전략적으로 배치 된 @Qualifier 주석을 추가함으로써 모두 해결되었습니다.

    이제는 몇 가지 추가 구성만으로도 모든 것이 훌륭하고 우아하게 작동합니다. 그럼에도 불구하고, 나는 아직도 이것이 일어난 이유를 이해하지 못한다. 내가 아는 전부는 JBoss 4.2.3에 응용 프로그램을 배포 할 때 다음 세 줄이 나타납니다. 반면에, 그들은 WebSphere에 나타나지 않습니다 :

    INFO  [org.springframework.context.annotation.ClassPathBeanDefinitionScanner] JSR-330 'javax.inject.Named' annotation found and supported for component scanning
    

    DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
    DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Creating instance of bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
    INFO  [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
    

    @Dreamer가 말했듯이 이것이 Spring의 책임이므로 WebSphere 비즈니스에서 벗어나야하는 이유가 무엇인지에 대한 단서가 아직 없습니다.

    누군가가 그런 단서를 가지고 있다면, 우리에게 계몽하십시오. 이 토론에 참여하는 모든 사람들에게 훌륭하게 분명히 해줄 것이라고 확신합니다.

  3. ==============================

    3.Duffymo에 동의하면 WS 7에서 작동해야합니다. Spring이 Websphere의 최상위에 있으므로 Spring annotation이 웹의 비즈니스 (일종의)에서 벗어났습니다.

    Duffymo에 동의하면 WS 7에서 작동해야합니다. Spring이 Websphere의 최상위에 있으므로 Spring annotation이 웹의 비즈니스 (일종의)에서 벗어났습니다.

    여러분이 아마 WS 7을 체크 할 필요가있을 것입니다. (모든 설정이 JBoss에서와 마찬가지로 정확하다고하더라도) 여러분의 어플리케이션을 클릭합니다 -> 클래스로드 및 업데이트 감지를 클릭하십시오. 클래스가 로컬 클래스 로더와 함께로드 된 클래스인지 먼저 확인하십시오 마지막)을 선택합니다. 그러면 서버가 응용 프로그램의 라이브러리를 가져 와서 websphere의 라이브러리를 먼저 가져옵니다.

  4. from https://stackoverflow.com/questions/14708725/dependency-injection-with-spring-jsr-330-annotations-in-websphere-7-is-not-wor by cc-by-sa and MIT license