According to the HTTP specification, the HTTP method is not limited to the well known set (GET, HEAD, PUT, POST, etc.), but can also be an "extension-method". Well known extensions include WebDAV, which added methods like LOCK, COPY, and MOVE.

In Spring Framework, HTTP methods are enumerated in HttpMethod. Because this type is an Java enum, Spring framework needs several workarounds, to allow for HTTP methods not in the enum, such as having both HttpRequest::getMethod as well as HttpRequest::getMethodValue.

If we change HttpMethod from enum to class, we no longer need these workarounds. If we make sure that the new class has the same methods that java.lang.Enum exposes, and given that upgrading to 6.0 requires a recompilation anyway, I believe that now is the time to make this long overdue change.

Note that this issue does not include support for non-standard HTTP (i.e. WebDAV) methods in Spring MVC and/or WebFlux.

Comment From: quaff

such as having both HttpMethod::getMethod as well as HttpRequest::getMethodValue.

HttpMethod::getMethod should be HttpRequest::getMethod

Comment From: poutsma

@quaff Fixed, thanks!

Comment From: quaff

Can we use extension-method for RequestMapping?

Comment From: poutsma

Can we use extension-method for RequestMapping?

I am not sure what you mean by that, can you elaborate? Because annotations can refer to enum elements but not classes, RequestMapping uses the RequestMethod enumeration.

Comment From: quaff

Can we use extension-method for RequestMapping?

I am not sure what you mean by that, can you elaborate? Because annotations can refer to enum elements but not classes, RequestMapping uses the RequestMethod enumeration.

I mean should RequestMapping introduce String[] methodValue() to supports extension-method?

Comment From: poutsma

I mean should RequestMapping introduce String[] methodValue() to supports extension-method?

RequestMapping uses RequestMethod, and that's fine the way it is. As I wrote in the description, we have no intention of supporting non-standard HTTP methods. HttpMethod is a lower-level component that is used for our HTTP abstraction, and that did need support for non-standard methods.

Comment From: tamizh-m

Hi @poutsma , After upgrading to Spring 6, I am unable to serialize and deserialize 'HttpMethod' using 'ObjectMapper' because the class does not have a public constructor or a getter for 'name' attribute. This issue did not arise previously when HttpMethod was an enum. Would be helpful if you can provide a workaround for this?

Comment From: poutsma

@tamizh-m Please file a new issue. This issue is closed.