一尘不染

Spring @Resource处理

tomcat

我在注解如@ResourceSpring bean中的字段时遇到麻烦。我有的:

用setter方法注释的字段 @Resource

@Resource
private URL someUrl;

public void setSomeUrl(URL someUrl) {
    this.someUrl = someUrl;
}

<env-entry>我的部署描述符(web.xml)中的标签

<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,并且@Service为自动装配到其他@Component实例中注释了bean本身。在这种情况下,Servlet容器是Tomcat
7,但最终将部署到Weblogic 10上,因此,尽管我理想地希望在两者上都能使用一种解决方案,但Weblogic是必不可少的。

我在Spring 2.5中滥用此功能吗?一般来说?我有什么想念的吗?我对JNDI有误解吗?感谢所有帮助。谢谢。


阅读 422

收藏
2020-06-16

共1个答案

一尘不染

如果您使用的是Spring
Stereotype批注(@Service@Component…),则可能在spring配置中包括了将<context:component- scan />其拾取的元素。可以这样做,但是它会自动CommonAnnotationBeanPostProcessor在应用程序上下文中注册a
如该链接中第二个注释上方所述

包含的问题CommonAnnotationBeanPostProcessor是Spring处理@Resource注释,并将尝试从其应用程序上下文注入bean。您可以注册自己的CommonAnnotationBeanPostProcessorbean,并@Resource通过将bean设置为alwaysUseJndiLookup属性来配置bean,以指示Spring允许直接JNDI访问这些bean
true

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
  <property name="alwaysUseJndiLookup" value="true"/>
</bean>

请注意链接文档中的注释:

注意:默认的CommonAnnotationBeanPostProcessor将通过“ context:annotation-config”和“
context:component-scan” XML标签进行注册。如果要指定自定义CommonAnnotationBeanPostProcessor
bean定义,请删除或关闭那里的默认注释配置!

2020-06-16