我有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手动配置。
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。
我最终通过延长两个组件扫描和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.AutowiredAnnotationBeanPostProcessor
延长了自动装配资格@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业务的。
如果有人确实有这样一个线索,请指点迷津。 我敢肯定,这将是美妙澄清大家参与讨论。
与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