2017-02-27 53 views
0

我想隱藏Apache Camel Servlet隱藏在Spring MVC Controller入口點後面,因爲我擁有一些專有組件,我必須使用它們,這取決於Sping Boot和Spring MVC Controller。將Apache Camel servlet隱藏在Spring MVC Controller入口點後面

我有以下Apache的駱駝路線,這是工作的罰款

<route id="Route"> 
      <from uri="servlet:messages?httpMethodRestrict=POST"/> 
      <process ref="..."></process> 
      <to uri="{{storage.service.endpoint}}?bridgeEndpoint=true"/> 
</route> 

我已經註冊了駱駝的Servlet without any URL mappings,因爲我不希望直接訪問。春豆:

@Bean 
ServletRegistrationBean servletRegistrationBean() { 
     CamelHttpTransportServlet camelServlet = new CamelHttpTransportServlet(); 
     ServletRegistrationBean servletBean = new ServletRegistrationBean(camelServlet, false, new String[]{}); 
     servletBean.setName("CamelServlet"); 
     return servletBean; 
} 

在Spring控制器入口點我只需要轉發到駱駝的Servlet:

@RequestMapping(method=RequestMethod.POST, value="/api/v1/*") 
public void wrapper(HttpServletRequest request, HttpServletResponse response) throws Exception{ 
     context.getNamedDispatcher("CamelServlet").forward(request, response); 
} 

問題是駱駝的Servlet依賴於ServletResolveConsumerStrategy使用request.getPathInfo(),這始終是null在Spring Controller入口點。我已嘗試@RequestMapping中的不同路徑,但總是request.getServletPath()具有完整路徑並且pathInfo爲空

P.S.該應用程序在Tomcat 8上運行。

回答

0

使用路徑變量修改春季控制器入口點和一個自定義HttpServletRequestWrapper設置路徑變量pathInfo()的價值:

@RequestMapping(path="/api/v1/{messages}" , method=RequestMethod.POST) 
    public void wrapper2(HttpServletRequest request, HttpServletResponse response, @PathVariable String messages) throws Exception{ 
     request = new PathInfoRequestWrapper(request, messages); 
     context.getNamedDispatcher("CamelServlet").forward(request, response); 

    } 

    class PathInfoRequestWrapper extends HttpServletRequestWrapper{ 
    private String pathInfo; 

    public PathInfoRequestWrapper(HttpServletRequest request, String pathInfo) { 
     super(request); 
     this.pathInfo = pathInfo; 
    } 

    @Override 
    public String getPathInfo(){ 
     String origPathInfo = super.getPathInfo(); 
     if(origPathInfo == null || origPathInfo.equals("")){ 
      return this.pathInfo; 
     }else{ 
      return origPathInfo; 
     } 
    } 
    } 
0

一種解決方案是創建自定義ServletResolveConsumerStrategy,它僅依賴於request.getServletPath()來查找適當的路由。不幸的是,只有使用org.apache.camel.http.common.CamelServlet.setServletResolveConsumerStrategy(ServletResolveConsumerStrategy)設置策略不起作用,因爲它在org.apache.camel.component.servlet.CamelHttpTransportServlet.init方法中被覆蓋。所以,你需要覆蓋在駱駝的Servlet初始化,以及:

CamelHttpTransportServlet camelServlet = new CamelHttpTransportServlet(){ 
      @Override 
      public void init(ServletConfig config) throws ServletException { 
       super.init(config); 
       ServletResolveConsumerStrategy servletResolveConsumerStrategy = new CamelSpringResolveConsumerStrategy(); 
       setServletResolveConsumerStrategy(servletResolveConsumerStrategy); 
      } 
     };