我在Spring bean中注释为@Resource
的字段时遇到了问题。我有什么:
带有setter方法的字段,带注释@Resource
@Resource
private URL someUrl;
public void setSomeUrl(URL someUrl) {
this.someUrl = someUrl;
}
部署描述符(web.xml)中的<env-entry>
标记
<env-entry>
<env-entry-name>someUrl</env-entry-name>
<env-entry-type>java.net.URL</env-entry-type>
<env-entry-value>http://somedomain.net/some/path</env-entry-value>
</env-entry>
应用程序无法以BeanCreationException
开头,我不希望这样,因为我不一定希望spring注入一个Spring管理的bean。我希望Spring处理@Resource
并检索JNDI资源。
这是Spring 2.5.6SEC03,bean本身带注释@Service
,用于自动装入其他@Component
个实例。在这种情况下,Servlet容器是Tomcat 7,但最终将部署到Weblogic 10上,所以虽然我希望理想的解决方案同时适用于两者,但Weblogic是必备的。
我是否在Spring 2.5中滥用此功能?一般来说?我有点遗失吗?我误解了JNDI的一些事情?所有帮助表示赞赏。感谢。
答案 0 :(得分:7)
如果您正在使用Spring Stereotype注释,(@Service
,@Component
...),那么您可能会在弹簧配置中包含<context:component-scan />
元素以进行拾取。这样做很好,但它会自动在应用程序上下文CommonAnnotationBeanPostProcessor
中注册as stated just above the second note in this link。
包含CommonAnnotationBeanPostProcessor
的问题是Spring处理@Resource
注释并将尝试从其应用程序上下文中注入bean。您可以注册自己的CommonAnnotationBeanPostProcessor
bean,并通过将@Resource
属性设置为alwaysUseJndiLookup
来配置bean来告诉Spring允许直接JNDI访问这些true
。
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
<property name="alwaysUseJndiLookup" value="true"/>
</bean>
请注意链接文档中的注释:
注意:默认的CommonAnnotationBeanPostProcessor将由“context:annotation-config”和“context:component-scan”XML标记注册。如果要指定自定义CommonAnnotationBeanPostProcessor bean定义,请删除或关闭默认注释配置!