2011-10-03 97 views
2

我四處尋找解決方案並找不到。@Autowired無法使用彈簧3

我使用Tomcat,春季3的罐子:

org.springframework.aop-3.0.5.RELEASE.jar 
org.springframework.asm-3.0.5.RELEASE.jar 
org.springframework.beans-3.0.5.RELEASE.jar 
org.springframework.context-3.0.5.RELEASE.jar 
org.springframework.core-3.0.5.RELEASE.jar 
org.springframework.expression-3.0.5.RELEASE.jar 
org.springframework.jdbc-3.0.5.RELEASE.jar 
org.springframework.orm-3.0.5.RELEASE.jar 
org.springframework.test-3.0.5.RELEASE.jar 
org.springframework.transaction-3.0.5.RELEASE.jar 
org.springframework.web-3.0.5.RELEASE.jar 

,我的代碼是這樣的:

public class EmailResource { 
@Autowired 
EmailManager emailManager; 
} 
中的applicationContext

我:

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

<bean 
    class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 
<bean id="emailManager" class="com.mycompany.manager.impl.EmailManagerImpl" /> 
<context:component-scan base-package="com.mycompany.component" /> 

和web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 


    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:/applicationContext.xml</param-value> 
    </context-param> 


    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
</web-app> 

但是,emailManager始終爲空!我錯過了什麼?

EDITED

的EmailResource爲其餘呼叫球衣servlet和的定義如下:

<servlet> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.mycompany.resource</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 
+0

如何創建EmailResource? – stivlo

+0

我編輯了我的答案 – Dejell

回答

8

您需要使用Jersey/Spring連接器才能讓Jersey在啓動時識別您的Spring上下文。

替換:

<servlet> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.mycompany.resource</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

有了:

<servlet> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
    .... 
    </init-param> 
</servlet> 

你還需要在球衣彈簧依賴性:

<dependency> 
    <groupId>com.sun.jersey.contribs</groupId> 
    <artifactId>jersey-spring</artifactId> 
    <version>${jersey.version}</version> 
</dependency> 
+0

經過大約三個小時的痛苦和質疑我自己的Spring知識(爲什麼東西不會autowire儘管我已經使用了相同的配置多次),我遇到了這個。非常感謝。 –

+1

如果有人試圖在Spring 4中使用這種方法,它仍然可以工作,但是你會得到NoSuchMethodException,因爲Spring AOP這個依賴項的版本並不好。我周圍有通過明確排除在我的Maven POM的AOP依賴性: ' com.sun.jersey.contribs 球衣彈簧 1.18 org.springframework spring-aop ' –

1

的問題是,澤西的servlet在web.xml指定爲servlet和由此不受Spring的控制。 Spring不能連接依賴關係。

我對澤西不甚瞭解,但我發現this article這對您可能有用。

而且,你要考慮EmailManager是一個Servlet的實例變量,你宣佈它爲春天辛格爾頓(默認):

<bean id="emailManager" class="com.mycompany.manager.impl.EmailManagerImpl" /> 

因此emailManager不應該有任何國家或將是非線程安全。

解釋問題:假設emailManager包含一個狀態,例如目標地址,主題和消息主體。由於被定義爲單例,所以整個應用程序只有一個實例。如果兩個不同的人同時調用servlet,則第一個進程可能會插入主題,並且第二個進程會重寫同一個主題,然後才能發送電子郵件。所以這兩封電子郵件的數據會混雜在一起。

或者可以使用範圍請求來定義它,因此每個請求都會有不同的實例。

+0

我不理解你對EmailManager和Spring Singleton的評論 – Dejell

+0

請參閱上面的內容,我已經編輯了我的答案,因爲評論有點長。 – stivlo

+0

我的問題是,在文章中作者建議使用@Inject,但它已被棄用.. – Dejell