From e65f296f6a1b82042df1b4c5db8b5973fb87b3bf Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Fri, 10 Dec 2021 10:37:06 +0100 Subject: [PATCH] =?UTF-8?q?#1729=20-=20Added=20equals(=E2=80=A6)=20and=20h?= =?UTF-8?q?ashCode()=20methods=20to=20TypeBasedPayloadMetadata.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mediatype/TypeBasedPayloadMetadata.java | 38 +++++++++++++++++++ .../server/mvc/WebMvcLinkBuilderUnitTest.java | 21 ++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/main/java/org/springframework/hateoas/mediatype/TypeBasedPayloadMetadata.java b/src/main/java/org/springframework/hateoas/mediatype/TypeBasedPayloadMetadata.java index 8005f4ca..81a2ee9a 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/TypeBasedPayloadMetadata.java +++ b/src/main/java/org/springframework/hateoas/mediatype/TypeBasedPayloadMetadata.java @@ -115,4 +115,42 @@ class TypeBasedPayloadMetadata implements InputPayloadMetadata { public List getMediaTypes() { return mediaTypes; } + + /* + * (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + + if (obj == this) { + return true; + } + + if (!(obj instanceof TypeBasedPayloadMetadata)) { + return false; + } + + TypeBasedPayloadMetadata that = (TypeBasedPayloadMetadata) obj; + + return this.type.equals(that.type) + && this.properties.equals(that.properties) + && this.mediaTypes.equals(that.mediaTypes); + } + + /* + * (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + + int result = 31; + + result += 17 * type.hashCode(); + result += 17 * properties.hashCode(); + result += 17 * mediaTypes.hashCode(); + + return result; + } } diff --git a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java index 77fa56de..c53e0cca 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java @@ -53,6 +53,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.RequestContextHolder; @@ -693,6 +694,19 @@ class WebMvcLinkBuilderUnitTest extends TestUtils { ).forEach(assertThatNoException()::isThrownBy); } + @Test // #1729 + @SuppressWarnings("null") + void linksPointingToTheSameMethodAreEqual() { + + Link first = linkTo(methodOn(ControllerWithMethods.class).methodWithRequestBody(null)).withSelfRel(); + Link second = linkTo(methodOn(ControllerWithMethods.class).methodWithRequestBody(null)).withSelfRel(); + + assertThat(first).isEqualTo(second); + assertThat(second).isEqualTo(first); + assertThat(first.hashCode()).isEqualTo(second.hashCode()); + assertThat(second.hashCode()).isEqualTo(first.hashCode()); + } + private static UriComponents toComponents(Link link) { return UriComponentsBuilder.fromUriString(link.expand().getHref()).build(); } @@ -798,6 +812,12 @@ class WebMvcLinkBuilderUnitTest extends TestUtils { HttpEntity methodWithCustomEnum(@RequestParam List param) { return null; } + + // #1729 + @RequestMapping(method = RequestMethod.POST, path = "/with-request-body") + HttpEntity methodWithRequestBody(@RequestBody Person param) { + return null; + } } @RequestMapping("/parent") @@ -878,4 +898,5 @@ class WebMvcLinkBuilderUnitTest extends TestUtils { } } } + }