Java 托米:将请求转发到另一场战争

Java 托米:将请求转发到另一场战争,java,war,apache-tomee,Java,War,Apache Tomee,我无法让TomEE将我的请求从同一ear文件转发到不同的Web应用程序 我更新了启用context.xml的crossContext: 我转发的webapp是一个简单的Servlet: protectedvoiddopost(HttpServletRequest-req,HttpServletResponse-resp)抛出ServletException,IOException{ 试一试{ 请求调度员; dispatcher=getServletContext().getContext(“

我无法让TomEE将我的请求从同一ear文件转发到不同的Web应用程序

我更新了启用context.xml的crossContext:


我转发的webapp是一个简单的Servlet:

protectedvoiddopost(HttpServletRequest-req,HttpServletResponse-resp)抛出ServletException,IOException{
试一试{
请求调度员;
dispatcher=getServletContext().getContext(“/web2”).getRequestDispatcher(“/webapp2/hello”);
调度器转发(req,resp);
}捕获(例外e){
StringWriter sw=新的StringWriter();
PrintWriter pw=新的PrintWriter(sw,真);
e、 printStackTrace(pw);
响应发送错误(HttpServletResponse.SC_BAD_请求,sw.toString());
}
}
应该转发到的webapp是一个Rest资源,如下所示:

package local.gerb;
导入javax.ws.rs.*;
@路径(“webapp2”)
公共类HelloResource{
@得到
@路径(“你好”)
@生成(“文本/纯文本”)
公共字符串getMessage(){
返回“休息不睡觉”;
}
}
我确实通过卷曲特定端点来验证webapps2是否正常工作

然而,当我卷曲webapp1时,它应该转发到webapp2,我得到一个404。奇怪的是,如果我将Rest资源转换为一个普通的servlet,那么转发就可以正常工作

如果您想查看我推送到github的代码:


我有一个自述文件,解释如何构建和运行这个应用程序。它在docker容器中运行,因此所有内容都是独立的,并且非常易于构建和运行

我决定调试TomEE,并在CXFJAXRSFilter.java中发现了导致问题的代码:

@覆盖
public void doFilter(最终ServletRequest请求、最终ServletResponse响应、最终FilterChain链)抛出IOException、ServletException{
如果(!HttpServletRequest.class.isInstance(请求)){
链式过滤器(请求、响应);
回来
}
最终HttpServletRequest HttpServletRequest=HttpServletRequest.class.cast(请求);
最终HttpServletResponse HttpServletResponse=HttpServletResponse.class.cast(响应);
if(CxfRsHttpListener.TRY\u STATIC\u RESOURCES){//else 100%JAXRS
if(servletMappingIsUnderRestPath(httpServletRequest)){
链式过滤器(请求、响应);
回来
}
final InputStream staticContent=delegate.findStaticContent(httpServletRequest,welcomeFiles);
if(staticContent!=null){
链式过滤器(请求、响应);
回来
}
}
试一试{
delegate.doInvoke(
新的ServletRequestAdapter(httpServletRequest、httpServletResponse、request.getServletContext()),
新的ServletResponseAdapter(httpServletResponse));
}捕获(最终异常e){
抛出新的ServletException(“错误处理webservice请求”,e);
}
}
引起问题的线路:

if(CxfRsHttpListener.TRY\u STATIC\u RESOURCES){//else 100%JAXRS
所以我找到了TRY\u STATIC\u资源的定义

public static final boolean TRY_static_RESOURCES=“true”.equalsIgnoreCase(SystemInstance.get().getProperty(“openejb.jaxrs.static first”,“true”);
因此,我将openejb.jaxrs.static-first的system.property更新为false,它成功了

$>curl'http://localhost:8080/web1/webapp1?op=foo'
来自Webapp2 Rest资源的您好%
我把我的更改推到我的github回购协议上,让我们中的一些人都能接受