2015-10-23 8 views
6

COPY HTTPメソッドを処理するリソース用のカスタムSpring MVCコントローラを作成しようとしています。Spring MVCのカスタムHTTPメソッド

@RequestMappingは、GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONSおよびTRACEの値のみを受け入れます。

Spring MVCコントローラでカスタムHTTPメソッドを処理する方法はありますか?

答えて

2

Servlet specificationのみGETHEADPOSTPUTDELETEOPTIONS又はTRACE HTTPメソッドを可能にします。これはApache Tomcat implementation of the Servlet APIで見ることができます。

これはSpring APIのRequestMethod enumerationに反映されています。

あなたはCOPY HTTPメソッドを許可するようにserviceメソッドをオーバーライドし、独自のDispatcherServletを実装することにより、それらの周りにあなたの方法をカンニングすることができます - それはメソッドをPOSTするために変更し、同様にそれを許可するようにRequestMappingHandlerAdapter Beanをカスタマイズします。春ブートを使用して、このような

何か、:

@Controller 
@EnableAutoConfiguration 
@Configuration 
public class HttpMethods extends WebMvcConfigurationSupport { 

    public static class CopyMethodDispatcher extends DispatcherServlet { 
     private static final long serialVersionUID = 1L; 

     @Override 
     protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { 
      if ("COPY".equals(request.getMethod())) { 
       super.doPost(request, response); 
      } 
      else { 
       super.service(request, response); 
      } 
     } 
    } 

    public static void main(final String[] args) throws Exception { 
     SpringApplication.run(HttpMethods.class, args); 
    } 

    @RequestMapping("/method") 
    @ResponseBody 
    public String customMethod(final HttpServletRequest request) { 
     return request.getMethod(); 
    } 

    @Override 
    @Bean 
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { 
     final RequestMappingHandlerAdapter requestMappingHandlerAdapter = super.requestMappingHandlerAdapter(); 
     requestMappingHandlerAdapter.setSupportedMethods("COPY", "POST", "GET"); // add all methods your controllers need to support 

     return requestMappingHandlerAdapter; 
    } 

    @Bean 
    DispatcherServlet dispatcherServlet() { 
     return new CopyMethodDispatcher(); 
    } 
} 

今、あなたはCOPY HTTPメソッドを使用して/methodエンドポイントを呼び出すことができます。 curlを使用すると、これは次のようになります:

curl -v -X COPY http://localhost:8080/method 
関連する問題