Spring MVC中的自定义HTTP方法

我正在尝试为处理COPY HTTP方法的资源创建自定义Spring MVC控制器。

@RequestMapping仅接受以下RequestMethod值:GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS和TRACE。

在Spring MVC Controller中是否有任何推荐的处理自定义HTTP方法的方法?

Servlet规范仅允许GETHEADPOSTPUTDELETEOPTIONSTRACE HTTP方法。 这可以在Servlet API的Apache Tomcat 实现中看到。

这反映在Spring API的RequestMethod枚举中 。

您可以通过实现自己的DispatcherServlet覆盖service方法以允许COPY HTTP方法 – 将其更改为POST方法,并自定义RequestMappingHandlerAdapter bean以允许它来欺骗您。

像这样的东西,使用spring-boot:

 @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