Spring Struts2 Hessian集成的一個問題

最近在做系統改造的時候,還遇到了一個問題是,如何集成Spring Struts2和Hessian。


當配置Spring和Struts2的時候,在web.xml做了如下配置:

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:/spring/*.xml</param-value>
</context-param>
<listener>
  <listener-class>
    org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>

通過設置listener加載Spring的上下文環境,並在struts.xml中設置對象工廠爲Spring:

<constant name="struts.objectFactory" value="spring" />

這樣,Struts2就可以使用Spring上下文環境中的action bean了。


但在配置Hessian的時候,以前在web.xml中是這樣配置的:

<servlet>
  <servlet-name>Remoting</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/*.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
   <servlet-name>Remoting</servlet-name>
   <url-pattern>/remoting/*</url-pattern>
</servlet-mapping>

在初始化Hessian的servlet的時候又一次把Spring配置文件作爲參數,這樣又會重新生成一個Spring上下文環境,導致Spring中bean的重複。


爲了解決這個問題,在配置Hessian時,做了一下修改,如下:

<servlet>
   <servlet-name>Remoting</servlet-name>
   <servlet-class>
     org.springframework.web.servlet.DispatcherServlet
   </servlet-class>
   <init-param>
      <!-- <param-name>contextConfigLocation</param-name>
      <param-value>classpath:/spring/*.xml</param-value> -->
      <!-- 該servlet的spring上下文采用WebApplicationContext,不再重複生成上下文 -->
      <param-name>contextAttribute</param-name>
      <param-value>
        org.springframework.web.context.WebApplicationContext.ROOT
      </param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>

即在初始化Hessian時不再傳入Spring配置文件,而是傳入通過listener初始化的Spring WebApplicationContext上下文環境,即使用同一個上下文環境。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章