【背景介绍】
目前正在开发一个小工具,需要采用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>