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
forRequestMapping
?
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
forRequestMapping
?I am not sure what you mean by that, can you elaborate? Because annotations can refer to enum elements but not classes,
RequestMapping
uses theRequestMethod
enumeration.
I mean should RequestMapping
introduce String[] methodValue()
to supports extension-method
?
Comment From: poutsma
I mean should
RequestMapping
introduceString[] methodValue()
to supportsextension-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.