在我的SpringMVC项目中,我需要一个特定的策略来调用一个解析xml文件的类,该文件拥有我的RMI服务器ip&港口和url必须相对于servletContext url:
HttpServletRequest request;
request.getServletContext().getRealPath("/WEB-INF/LABLAB/RMI-Config.xml")
我想在tomcat中启动应用程序时加载这些类,而不是在我调用Controller类时,因为我的应用程序依赖于我的RMI,因此在我需要解析文件和其他任何内容之前。使用IP& PORT字段开始连接到我的RMI&然后调用rmi方法稍后再做一些事情......
现在
我该怎么办?请告诉我如何初始化HttpServletRequest和amp;的实例。当我不在Controller类上时给出一个初始值。
谢谢
答案 0 :(得分:3)
您正在使用Spring,然后您可以创建一个类并实现IntializingBean。如果你想获得ServletContext
,你可以在初始化bean中简单地使用@Autowired
注释。例如:
@Component
public class SomeBean implements InitializingBean {
@Autowired
private ServletContext context;
public void afterPropertiesSet() throws Exception {
String path = context.getRealPath("/WEB-INF/LABLAB/RMI-Config.xml");
//do something.
}
}
根据文档:
IntializingBean - 由需要的bean实现的接口 一旦BeanFactory设置了所有属性,就会做出反应。
或者使用ServletContextListener
查看here如何执行此操作。
答案 1 :(得分:2)
您需要实施ServletContextListener
界面并从web.xml
引用它:
<listener>
<listener-class>InitializingListener</listener-class>
</listener>
界面采用contextInitialized(ServletContextEvent sce)
方法,您可以在其中调用sce.getServletContext()
,因此您不需要HttpServletRequest
。
如果这不成功,因为您还需要从初始化类访问一些Spring bean,然后忘记实现ServletContextListener
接口,而是执行以下操作:
ServletContextAware
。这将导致Spring将ServletContext
注入您的班级。init-method
bean属性,或定义@PostConstruct
带注释的方法)depends-on
bean属性使所有Controller bean依赖于初始化bean。因此,initialaizing bean将在任何Controller bean之前创建。如果没有最后一步,则无法保证您的控制器在初始化bean完成其工作之前不会开始处理请求。但是,在每个控制器bean上指定depends-on
属性也存在问题,尤其是它们通常是通过应用@Controller
注释而不是xml配置来创建的。 this post中描述了一个很好的解决方法。