2013-04-25 215 views
0

我想在我的servlet 3.0應用程序中使用範圍內的請求。Spring @Scope(「請求」)不適用於Servlet 3.0

我沒有使用web.xml,而是使用了WebApplicationInitializer的實現。該onStartup方法是這樣的:

@Override 
public void onStartup(ServletContext servletContext) throws ServletException { 

    AnnotationConfigWebApplicationContext applicationContext = 
      new AnnotationConfigWebApplicationContext(); 

    applicationContext.setServletContext(servletContext); 
    applicationContext.scan("package containing proxy scoped bean and other stuff"); 

    applicationContext.refresh();   

    servletContext.addListener(new ContextLoaderListener(applicationContext)); 
    servletContext.addListener(new RequestContextListener()); 
} 

和請求範圍的bean是這樣的:

@Component 
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class CallerInformation { 

    private String clientIp; 

    public String getClientIp() { 
     return clientIp; 
    } 

    public void setClientIp(String clientIp) { 
     this.clientIp = clientIp; 
    } 
} 

現在注入的「CallerInformation」不是CGLIB的代理,但行爲像原型作用域,它是在每個類中的不同實例,它不通過請求保存任何信息...

任何想法我做錯了什麼?

編輯:

我已經試過相同的情況下使用Servlet 2.5和web.xml配置,它拼命地工作;)

+0

我不知道你的意思。 – woezelmann 2013-04-25 08:58:32

+0

你用Servlet 3.0和web.xml試過了嗎?嘗試它也... – 2013-04-25 11:56:53

+0

也嘗試改變順序爲'servletContext.addListener(new RequestContextListener()); servletContext.addListener(new ContextLoaderListener(applicationContext));'Listerner命令也可以做一些問題。不是100%確定這是因爲這裏.. ' – 2013-04-25 12:07:49

回答

0

的行爲是正確的。 實例只存在一個請求。 參見this site瞭解更多信息。

試圖注入彈簧組件與@Autowired註釋

+0

我認爲你不明白我的問題:在一個請求裏面是CallerInformation的n個不同實例,每個實例都有自己的(在我的情況下爲null)屬性值。 – woezelmann 2013-04-25 07:59:24

+0

啊好吧我明白了。 你有沒有試過檢查是否有多個請求實例? – 2013-04-25 08:07:18

+0

我不認爲這是問題所在。 CallerInformaion實例應該是某種CGLIB代理,但它不是。我認爲Spring不會評估@Scope或somthink ... – woezelmann 2013-04-25 08:30:34