-
Notifications
You must be signed in to change notification settings - Fork 38.7k
Description
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.
Activity
quaff commentedon Nov 25, 2021
HttpMethod::getMethod
should beHttpRequest::getMethod
poutsma commentedon Nov 25, 2021
@quaff Fixed, thanks!
Changes because HttpMethod changed to class
Use HttpMethod::valueOf in HttpMethod::resolve
quaff commentedon Dec 1, 2021
Can we use
extension-method
forRequestMapping
?poutsma commentedon Dec 1, 2021
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.quaff commentedon Dec 2, 2021
I mean should
RequestMapping
introduceString[] methodValue()
to supportsextension-method
?poutsma commentedon Dec 2, 2021
RequestMapping
usesRequestMethod
, 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.Additional changes because HttpMethod changed from enum to class
Fix regression in WebFlux support for WebDAV methods
tamizh-m commentedon May 28, 2024
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?
poutsma commentedon May 28, 2024
@tamizh-m Please file a new issue. This issue is closed.
refactor: Added custom serializers to handle HttpMethod objects as it…
refactor(mapper): add custom serializer to handle HttpMethod object d…
refactor: Added custom serializers to handle HttpMethod objects as it…