Java 如何在SpringXML元数据配置中为bean设置ServletContext属性
我试着在这里搜索,但找不到解决方案。我有一些XML元数据,如下所示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> 通过这种配置,我得到一个异常
<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
的句柄,并且可以根据超类方法可见性将其设置为该方式。诚然,有很多“如果”,但它可能会起作用!