Spring MVC 中的自定义 HTTP 方法

Custom HTTP Methods in Spring MVC

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

@RequestMapping accepts only the following RequestMethod 值:GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS 和 TRACE。

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

Servlet specification allows only for GET, HEAD, POST, PUT, DELETE, OPTIONS or TRACE HTTP methods. This can be seen in the Apache Tomcat implementation of the Servlet API.

这反映在 Spring API 的 RequestMethod enumeration 中。

您可以通过实现自己的 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