strtus2 + spring + CXF 实现能访问action的同时还能调用spring发布的Webservice

来源:互联网 发布:大逃杀类游戏知乎 编辑:程序博客网 时间:2024/06/04 12:02

【背景介绍】

       目前正在开发一个小工具,需要采用CXF结合Spring发布Webservice提供给外部应用访问,当然java开发是离不开struts2这样的控制器的,

所以这样就会存在一个问题了,如果我们简单的将CXF,spring,struts的相关配置,在web.xml配置好,而不继承struts的filter将webservice请求单独拿出来

处理,就会导致struts会将我们的webservice请求当做action请求一样来处理,而我们又没有在struts的配置文件中配置webservice请求的action,这样我们调用webservice的时候,就会提示我们没有相对应的action配置。

 

【解决方案】

1、新建一个类继承struts的filter,用来将webservice和action分开来处理:

 

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;

public class StrutsInitPrepareAndExecuteFilter extends StrutsPrepareAndExecuteFilter
{
     @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
              FilterChain chain) throws IOException, ServletException { 
   
        try { 
              HttpServletRequest request = (HttpServletRequest) req; 
              // 判断是否是向WebService发出的请求  
               if (request.getRequestURI().contains("/CXFService")) { 
                 // 如果是来自向CXFService发出的请求  
                  chain.doFilter(req, res); 
               } else { 
                  // 默认action请求
                  super.doFilter(req, res, chain); 
              } 
          } catch (Exception e) {  
                e.printStackTrace(); 
           } 
        }
}

2、在web.xml中将新建的类配置为struts的入口filter:

     <filter>
        <filter-name>struts2</filter-name>
        <filter-class>StrutsInitPrepareAndExecuteFilter</filter-class>
     </filter>
     <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
     </filter-mapping>
0 0
原创粉丝点击