2014-10-29 67 views
2

我試過在這裏搜索,但是我找不到解決方案。我有一些XML元數據,如下所示。如何在Spring XML元數據配置中爲Bean設置ServletContext屬性

<bean class="javax.servlet.ServletContext" id="servletContext" /> 

<bean class="com.abc.ProductController"> 
    <property name="servletContext" ref="servletContext"/> 
</bean> 

有了這個配置我正在一個異常說"javax.servlet.ServletContext"是一個接口,它無法與ID servletContext創建一個bean。 ProductController類位於某個我無法修改的jar文件中,但我希望它可以作爲我的應用程序中的一個bean。它具有自動裝配的ServletContext屬性。

回答

8

如果你需要在一個XML配置Spring應用程序創建ServletContext一個bean,你可以使用一個BeanFactory<ServletContext>實施ServletContextAware

public class ServletContextFactory implements FactoryBean<ServletContext>, 
      ServletContextAware{ 
    private ServletContext servletContext; 

    @Override 
    public ServletContext getObject() throws Exception { 
     return servletContext; 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return ServletContext.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.servletContext = servletContext; 
    } 

} 

那麼你可以聲明:

<bean class="org.app.ServletContextFactory" id="servletContext" /> 

<bean class="com.abc.ProductController"> 
    <property name="servletContext" ref="servletContext"/> 
</bean> 
0

就自動裝配的背景下在你的控制器:

@Autowired 
private ServletContext context; 
+0

我沒有修改代碼的選項 – phoenix 2014-10-29 14:21:05

+0

爲什麼你想注入一些東西呢? ;) – Stefan 2014-10-29 14:22:39

+0

該代碼已經具有Autowired註釋 – phoenix 2014-10-29 14:24:35

0

不能引用servlet上下文中的XML喜歡這樣,因爲它的生命週期由servlet容器控制。

解決的辦法是讓com.abc.ProductController執行ServletContextAware然後Spring會爲你設置它。

+0

我沒有修改代碼的選項 – phoenix 2014-10-29 14:22:39

+0

所以你可以在你的webapp中創建一個新的類來擴展'ProductController'(如果它不是final)並且實現'ServletContextAware'?然後你可以通過'setServletContext'方法處理'ServletContext',根據超類方法的可見性可以設置它。誠然,很多'ifs',但它可能工作! – 2014-10-29 15:17:41

0

與Java的配置使用ServletContextFactory上面由Serge Ballesta創建,並且:

@Configuration 
public class WebAppConfiguration { 

    @Autowired 
    private ServletContextFactory servletContextFactory; 

    @Bean 
    public ServletContextFactory servletContextFactory() { 
     return new ServletContextFactory(); 
    } 
} 
相關問題