2014-10-29 102 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(); 
    } 
} 
相关问题