我有一个使用Java6、Spring Framework 3.1.2和Mule-ESB 3.3.0以及其他与此问题无关的库构建的企业应用程序。
我们的beans和服务都是用@Named和@Inject JSR-330注释声明的,分别用于自动组件扫描和依赖注入(没有EJB,只有服务beans)。当部署到JBoss 4.2.3 (我们的测试环境)中时,一切工作正常。但是,当部署到JSR7中时,WebSphere -330注释似乎不起作用。标记为@Named的bean根本不会被检测到。
我可以保证所有的配置都是正确的(因为它在JBoss中工作)。具体地说,<context:component-scan />正确定义了base-package属性,并将scope-resolver属性正确配置为使用Jsr330ScopeMetadataResolver (我们也尝试过不使用它)。
我知道WebSphere 7 (7.0.0.23)可能不支持这种注释。我还没有用@Component和@Autowired Spring的等价物来测试它。不幸的是,我们非常希望使用JSR330注释,这样我们的类就不会直接依赖于Spring,即使我们在幕后使用Spring Framework。
然而,尽管我花了一整天的时间寻找WebSphere 7不支持JSR330批注的明确声明,但到目前为止我还没有找到任何东西。
此外,我不明白为什么它不能工作,因为我假设Spring Framework是通过application-context.xml文件中的<context:component-scan />指令完成所有工作的。
有人能给这个问题带来一些启发吗?
在WebSphere 7中有没有办法通过注解激活依赖注入?
如果我从JSR330的@Named / @Inject注解切换回Spring自己的@Component和@Autowired,它可能工作吗?
在一次孤注一掷的尝试中,我是否可以扩展Spring的ComponentScanBeanDefinitionParser,以便即使在WebSphere 7中也能检测到JSR330批注?
如果什么都不起作用,我最终将退回到纯XML配置。然而,这是非常不可取的,因为在XML中将有数百个bean需要手动配置。
发布于 2013-02-05 23:38:41
JSR8似乎是可以使用的正确版本;它支持EE6 (WebSphere 7是EE5),而后者又包含CDI1.0(因此是WebSphere 299)。
下面是来自DeveloperWorks的代码片段,总结了WebSphere版本、JSR299和JSR300之间的关系
依赖注入是一种在进入Java世界之前多次出现在各种实现中的技术。Spring框架和Google Guice库是流行的实现。在JSR330中,有人试图将这些功能包含到J2SE平台中。JavaJSR299是一个规范,它使用了 330中定义的API,并添加了更多功能来支持Java需求。 implement应用服务器V8和V8.5 (非WebSphere概要文件)是完全兼容的JavaEE6容器,并实现了JSR299。
发布于 2013-02-06 18:13:46
我最终想出了一个解决办法,扩展了Spring Framework的组件扫描和自动连接功能。
首先,我在组件扫描器中添加了一个包含过滤器,这样@Named注解也可以被检测并注册到Spring Container:
<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.AutowiredAnnotationBeanPostProcessor添加了一个bean定义,将自动装配资格扩展到@Inject注释:
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
<property name="autowiredAnnotationType" value="javax.inject.Inject" />
</bean>最初,这可以很好地“重新激活”@Named和@Inject注释。然而,我仍然有一些冲突的bean的问题,在自动线候选解决过程中。这是由于Spring和JSR-330的默认解析过程不同造成的。这不是什么大问题,因为只有几个bean属于这种情况。它们都是通过添加一些有策略地放置的@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所说,这应该是Spring的责任,因此,应该脱离WebSphere业务。
如果有人真的有这样的线索,请告诉我们。我相信这对参与讨论的每个人来说都是非常好的澄清。
发布于 2013-02-06 05:54:08
同意duffymo的观点,它应该在WS7上工作。因为Spring在Websphere之上,所以Spring注解不是webshere的事(某种程度上)。
你可能需要在WS7上检查一件事(即使你说每一个配置都是正确的,因为它在JBoss上工作)是点击你的应用程序->点击Class loading and update detection,确保Classes loaded with local class loader first (parent last)被选中。这将使服务器首先获取应用程序的库,然后是websphere的库。
https://stackoverflow.com/questions/14708725
复制相似问题