2010-09-27 40 views
0

我剛剛從這篇文章(http://www.infoq.com/articles/spring-2.5-part-1)瞭解@Resource註釋,並希望利用它在Tomcat 6.0.26和3.0.3春季數據源不注入@Resource註釋字段alwaysUseJndiLookup設置

但它確實不工作 - 字段dsUsers類沒有初始化,我有NullPointerException當我嘗試進行查詢。

文件src/org/example/db/Users.java

package org.example.db; 
import javax.sql.DataSource; 
import javax.annotation.Resource; 

@Repository 
public class Users { 

@Resource private DataSource ds; 
... 
} 

文件WEB-INF/spring-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jee="http://www.springframework.org/schema/jee" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/jee 
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<context:component-scan base-package="org.example.web.controller,org.example.db" /> 

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

<jee:jndi-lookup id="ds" jndi-name="java:comp/env/jdbc/mydb" /> 

</beans> 

文件WEB-INF/web.xml

<resource-ref> 
    <description>DB Connection</description> 
    <res-ref-name>jdbc/mydb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

在日誌文件:

DEBUG 2010-09-27 21:56:00,085: Creating shared instance of singleton bean 'ds' 
DEBUG 2010-09-27 21:56:00,085: Creating instance of bean 'ds' 
DEBUG 2010-09-27 21:56:00,086: Eagerly caching bean 'ds' to allow for resolving potential circular references 
DEBUG 2010-09-27 21:56:00,106: Invoking afterPropertiesSet() on bean with name 'ds' 
DEBUG 2010-09-27 21:56:00,116: Finished creating instance of bean 'ds' 
DEBUG 2010-09-27 21:56:00,149: Found injected element on class [org.example.db.Users]: ResourceElement for private javax.sql.DataSource org.example.db.Users.ds 
DEBUG 2010-09-27 21:56:00,152: Found injected element on class [org.example.db.Users]: ResourceElement for private javax.sql.DataSource org.example.db.Users.ds 
DEBUG 2010-09-27 21:56:00,161: Processing injected method of bean 'users': ResourceElement for private javax.sql.DataSource org.example.db.Users.ds 
DEBUG 2010-09-27 21:56:00,163: Returning cached instance of singleton bean 'ds' 
DEBUG 2010-09-27 21:56:00,442: Returning cached instance of singleton bean 'ds' 
DEBUG 2010-09-27 21:56:00,593: Rejected bean name 'ds': no URL paths identified 
DEBUG 2010-09-27 21:56:00,738: Rejected bean name 'ds': no URL paths identified 

我不知道爲什麼它不起作用。

注:默認CommonAnnotationBeanPostProcessor會將由註冊「背景:註解配置」和「上下文:組件掃描」 XML標籤我documentation這個發現。如果您打算指定自定義的CommonAnnotationBeanPostProcessor bean定義,請在那裏刪除或關閉默認的註釋配置!

我認爲這可能是關於我的問題,但在這種情況下,我不知道如何「刪除或關閉默認註釋配置」。

請幫忙。 在此先感謝!

+0

我不確定這會解決你的問題,你可以嘗試將'ds'改爲someting,someting more 2 char? – 2010-09-27 15:29:47

+0

@Jaydeep:謝謝。不,沒有任何改變,因爲我將變量從ds更名爲dataSource。 – 2010-09-27 16:46:47

回答

0

目前已解決此問題。

所有這些代碼的作品,但我認爲這個問題是在一些相關的類。例如,我有以下自動裝配層次結構:dataSource注入Users類,Users類注入Validator,Validator從Controller中調用。在這條產業鏈是幾個錯誤:

  • 用戶使用的是新的校驗器實例
  • @Autowiring傳播之後創建的,用戶並沒有注入到驗證,因爲這個班是在另一個包和組件掃描找不到它
  • 後用戶沒有注入到驗證因爲這個類沒有@Component註釋
  • 控制器使用默認的構造函數

驗證程序的新實例在我解決所有這些問題都很好。