2017-02-27 2 views
0

Apache Camel ServletをSpring MVCコントローラのエントリポイントの背後に隠したいのですが、私はSping BootとSpring MVC Controllerに依存する独自のコンポーネントがあるからです。Spring MVCコントローラのエントリポイントの後ろにApache Camelサーブレットを隠す

は、私が直接アクセスできるようにしたくないので、私は、キャメルサーブレットwithout any URL mappingsを登録している

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

正常に動作している以下のApacheキャメルルートを持っています。春の豆:私はちょうどキャメルサーブレットに転送する必要が春コントローラのエントリポイントで

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

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

問題はキャメルサーブレットは常にnullあるrequest.getPathInfo()を、使用してServletResolveConsumerStrategyに依存しているということですSpring Controllerのエントリポイントにあります。私は@RequestMappingで異なるパスを試しましたが、常にrequest.getServletPath()はフルパスを持ち、はヌルです

P.S.アプリケーションはTomcat 8で実行されています。

答えて

0

は、パス変数を使用して、春のコントローラのエントリポイントを変更し、パス変数カスタムHttpServletRequestWrapperpathInfo()の値を設定します。

@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

解決策の1つは、適切なルートを見つけるためにrequest.getServletPath()のみに依存するカスタムServletResolveConsumerStrategyを作成することです。残念ながら、org.apache.camel.http.common.CamelServlet.setServletResolveConsumerStrategy(ServletResolveConsumerStrategy)で戦略を設定するだけでは、org.apache.camel.component.servlet.CamelHttpTransportServlet.initメソッドで上書きされるため、機能しません。 SOあなたにもキャメルサーブレット内のinitをオーバーライドする必要があります:

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