Java 如何在SpringXML元数据配置中为bean设置ServletContext属性

Java 如何在SpringXML元数据配置中为bean设置ServletContext属性,java,xml,spring,spring-mvc,Java,Xml,Spring,Spring Mvc,我试着在这里搜索,但找不到解决方案。我有一些XML元数据,如下所示 <bean class="javax.servlet.ServletContext" id="servletContext" /> <bean class="com.abc.ProductController"> <property name="servletContext" ref="servletContext"/> </bean> 通过这种配置,我得到一个异常

我试着在这里搜索,但找不到解决方案。我有一些XML元数据,如下所示

<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属性。

只需在控制器中自动连接上下文:

@Autowired
private ServletContext context;

您不能像这样引用XML中的servlet上下文,因为它的生命周期由servlet容器控制


解决方案是让
com.abc.ProductController
实现,然后Spring将为您设置它。

如果您需要在XML配置Spring应用程序中为
ServletContext
创建bean,您可以使用
BeanFactory
实现
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;
    }

}
公共类ServletContextFactory实现FactoryBean,
ServletContextAware{
私有ServletContext ServletContext;
@凌驾
公共ServletContext getObject()引发异常{
返回servletContext;
}
@凌驾
公共类getObjectType(){
返回ServletContext.class;
}
@凌驾
公共布尔isSingleton(){
返回true;
}
@凌驾
公共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>

通过java配置使用Serge Ballesta创建的ServletContextFactory,以及:

@Configuration
public class WebAppConfiguration {

    @Autowired
    private ServletContextFactory servletContextFactory;

    @Bean
    public ServletContextFactory servletContextFactory() {
         return new ServletContextFactory();
    }
}

那你为什么要注射东西?;)在这种情况下,它不会被扫描,也不会发生DI。你能发布你的xyzservlet.xml吗?我已经提到了xml。我的罐子弄糊涂了。因此,该注释可能是来自该jar的任务。没有此配置,其他bean和应用程序工作正常。如果属性具有
@Autowired
,则未对其进行处理,请确保已启用注释处理。Spring不会自动扫描注释。确保您有
来启用注释处理。因此,您能否在您的Web应用程序中创建一个新类,该类扩展
ProductController
(如果不是最终类)并实现
ServletContextAware
?然后,您可以通过
setServletContext
方法获得
ServletContext
的句柄,并且可以根据超类方法可见性将其设置为该方式。诚然,有很多“如果”,但它可能会起作用!