Skip to content

Refactor HttpMethod from enum to class #27697

@poutsma

Description

@poutsma
Contributor

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

added
in: webIssues in web modules (web, webmvc, webflux, websocket)
on Nov 18, 2021
added this to the 6.0 M1 milestone on Nov 18, 2021
self-assigned this
on Nov 18, 2021
quaff

quaff commented on Nov 25, 2021

@quaff
Contributor

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

HttpMethod::getMethod should be HttpRequest::getMethod

poutsma

poutsma commented on Nov 25, 2021

@poutsma
ContributorAuthor

@quaff Fixed, thanks!

quaff

quaff commented on Dec 1, 2021

@quaff
Contributor

Can we use extension-method for RequestMapping?

poutsma

poutsma commented on Dec 1, 2021

@poutsma
ContributorAuthor

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.

quaff

quaff commented on Dec 2, 2021

@quaff
Contributor

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?

poutsma

poutsma commented on Dec 2, 2021

@poutsma
ContributorAuthor

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.

tamizh-m

tamizh-m commented on May 28, 2024

@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?

poutsma

poutsma commented on May 28, 2024

@poutsma
ContributorAuthor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

in: webIssues in web modules (web, webmvc, webflux, websocket)type: enhancementA general enhancement

Type

No type

Projects

No projects

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @quaff@poutsma@jhoeller@tamizh-m

      Issue actions

        Refactor HttpMethod from enum to class · Issue #27697 · spring-projects/spring-framework