在WebSphere 7依赖注入春天(JSR 330个注解)不工作(Dependency injec

2019-08-16 19:02发布

我有Java 6中,Spring框架3.1.2和Mule ESB的3.3.0,内置不涉及这个问题,其他库中的企业应用程序。

我们的豆类和服务都与申报@Named@Inject JSR-330的注解,分别为自动元件扫描和依赖注入(没有的EJB,只有服务组件)。 当部署到JBoss的4.2.3(我们的测试环境),一切工作正常。 然而,当部署到WebSphere 7,JSR-330注解似乎并不奏效。 标有豆@Named只是没有发现,在所有。

我可以保证,所有的设定权(因为它在JBoss的工作)。 具体地, <context:component-scan />具有base-package属性正确定义和scope-resolver属性正确配置为使用Jsr330ScopeMetadataResolver (我们尝试没有它太)。

我知道的WebSphere 7(7.0.0.23)可能不支持这类的注解。 我还没有来测试它@Component@Autowired春季等价物。 不幸的是,我们非常希望使用JSR 330个注解,我们班就不会直接依赖于春,即使我们在引擎盖下使用Spring框架。

然而,尽管我花一个完整工作的一天找一个明确的说法了WebSphere 7不支持JSR 330个注解,我没有发现任何东西至今。

此外,我不明白为什么这是行不通的,因为我假设Spring框架是一个做所有的工作中,通过<context:component-scan />指令在application-context.xml文件。

任何人都可以带来一些轻到这个问题?

有没有一种方法来激活通过注释依赖注入在WebSphere 7?

如果我切换从JSR 330回@Named / @Inject注解Spring自身@Component@Autowired是可能奏效?

在绝望的尝试,我可以扩展Spring的ComponentScanBeanDefinitionParser所以它会检测JSR 330个注释甚至在WebSphere 7?

如果实在不行,我最终会回落到普通的XML配置。 这是极不可取的,但是,因为将有数百豆在XML手动配置。

Answer 1:

8的WebSphere似乎是用正确的版本; 它支持EE6(的WebSphere 7是EE5),其又包含CDI 1.0(因此JSR 299)。

下面是一个片段在developerWorks汇总的WebSphere版本,JSR 299和JSR 300之间的关系

依赖注入是已经在各种实现方式使得它在Java EE世人面前浮现无数次的技术。 Spring框架和谷歌吉斯图书馆是受欢迎的实现。 在JSR 330,试图包含这些功能集成到J2SE平台。 JSR 299是用于JSR 330中定义的API和增加了更多的功能,以支持Java EE需求的规范IBM的WebSphere Application Server V8和V8.5(非自由曲线)是完全兼容的Java EE 6的容器和实施JSR 299。



Answer 2:

我最终通过延长两个组件扫描和Spring框架的自动装配功能,想出了一个解决方法。

首先,我添加了一个包含过滤器组件扫描仪,使@Named批注也被认为有资格的检测和注册到Spring容器:

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

在此之后,我还添加了一个bean定义org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcesso‌​r延长了自动装配资格@Inject注释:

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

最初,这个工作得很好,以“复活”的@Named@Inject注解。 不过,我还是对的自动装配候选解决过程冲突的豆类的一些问题。 这是由于在春季和JSR-330的默认分辨率处理的差异。 这是没有什么大问题,因为只有少数豆掉进那个场景。 他们都加入了一些战略地位的解决@Qualifier注解。

现在,一切工作正常并且优雅,有一些额外的配置。 尽管如此,我仍然不明白为什么会这样。 我所知道的是,当我将应用程序部署到JBoss的4.2.3以下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说,这应该是一个春天的责任,因此,从WebSphere业务的。

如果有人确实有这样一个线索,请指点迷津。 我敢肯定,这将是美妙澄清大家参与讨论。



Answer 3:

与duffymo同意,应该对WS 7.工作作为春天是在WebSphere之上所以Spring注解是(在某种程度上)出webshere的业务。

有一件事你可能需要检查WS 7(即使你说的每一个配置是正确的,因为它的工作原理上的JBoss)是单击应用程序- >单击Class loading and update detection ,确保Classes loaded with local class loader first (parent last)被选中。 这将使把你的应用程序库的服务器来先其次是WebSphere的图书馆。



文章来源: Dependency injection with Spring (JSR 330 annotations) in WebSphere 7 is not working