Skip to content

Commit 2b5a319

Browse files
Behavior of AnnotatedMember.equals() (#3187) (#3195)
1 parent 2c221ad commit 2b5a319

File tree

5 files changed

+116
-10
lines changed

5 files changed

+116
-10
lines changed

release-notes/CREDITS-2.x

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1351,7 +1351,7 @@ Morten Andersen-Gott (magott@github)
13511351
* Contributed #3174: DOM `Node` serialization omits the default namespace declaration
13521352
(2.13.0)
13531353

1354-
Klaas Sellschaft (klaasdellschaft@github)
1354+
Klaas Dellschaft (klaasdellschaft@github)
13551355
* Contributed #3177: Support `suppressed` property when deserializing `Throwable`
13561356
(2.13.0)
13571357

src/main/java/com/fasterxml/jackson/databind/introspect/AnnotatedConstructor.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.fasterxml.jackson.databind.introspect;
22

3-
import java.lang.reflect.*;
4-
53
import com.fasterxml.jackson.databind.JavaType;
64
import com.fasterxml.jackson.databind.util.ClassUtil;
75

6+
import java.lang.reflect.Constructor;
7+
import java.lang.reflect.Member;
8+
import java.lang.reflect.Type;
9+
810
public final class AnnotatedConstructor
911
extends AnnotatedWithParams
1012
{
@@ -178,12 +180,20 @@ public String toString() {
178180
public int hashCode() {
179181
return _constructor.getName().hashCode();
180182
}
181-
183+
182184
@Override
183185
public boolean equals(Object o) {
184186
if (o == this) return true;
185-
return ClassUtil.hasClass(o, getClass())
186-
&& (((AnnotatedConstructor) o)._constructor == _constructor);
187+
if (!ClassUtil.hasClass(o, getClass())) {
188+
return false;
189+
}
190+
191+
AnnotatedConstructor other = (AnnotatedConstructor) o;
192+
if (other._constructor == null) {
193+
return _constructor == null;
194+
} else {
195+
return other._constructor.equals(_constructor);
196+
}
187197
}
188198

189199
/*

src/main/java/com/fasterxml/jackson/databind/introspect/AnnotatedField.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,16 @@ public int hashCode() {
135135
@Override
136136
public boolean equals(Object o) {
137137
if (o == this) return true;
138-
return ClassUtil.hasClass(o, getClass())
139-
&& (((AnnotatedField) o)._field == _field);
138+
if (!ClassUtil.hasClass(o, getClass())) {
139+
return false;
140+
}
141+
142+
AnnotatedField other = (AnnotatedField) o;
143+
if (other._field == null) {
144+
return _field == null;
145+
} else {
146+
return other._field.equals(_field);
147+
}
140148
}
141149

142150
@Override

src/main/java/com/fasterxml/jackson/databind/introspect/AnnotatedMethod.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,16 @@ public int hashCode() {
253253
@Override
254254
public boolean equals(Object o) {
255255
if (o == this) return true;
256-
return ClassUtil.hasClass(o, getClass())
257-
&& (((AnnotatedMethod) o)._method == _method);
256+
if (!ClassUtil.hasClass(o, getClass())) {
257+
return false;
258+
}
259+
260+
AnnotatedMethod other = (AnnotatedMethod) o;
261+
if (other._method == null) {
262+
return _method == null;
263+
} else {
264+
return other._method.equals(_method);
265+
}
258266
}
259267

260268
/*
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.fasterxml.jackson.databind.introspect;
2+
3+
import com.fasterxml.jackson.databind.BaseMapTest;
4+
import com.fasterxml.jackson.databind.DeserializationConfig;
5+
import com.fasterxml.jackson.databind.JavaType;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.databind.json.JsonMapper;
8+
9+
public class AnnotatedMemberEqualityTest extends BaseMapTest {
10+
11+
private static class SomeBean {
12+
13+
private String value;
14+
15+
public SomeBean(String value) {
16+
this.value = value;
17+
}
18+
19+
public String getValue() {
20+
return value;
21+
}
22+
23+
public void setValue(String value) {
24+
this.value = value;
25+
}
26+
}
27+
28+
public void testAnnotatedConstructorEquality() {
29+
ObjectMapper mapper = new JsonMapper();
30+
DeserializationConfig context = mapper.getDeserializationConfig();
31+
JavaType beanType = mapper.constructType(SomeBean.class);
32+
33+
AnnotatedClass instance1 = AnnotatedClassResolver.resolve(context, beanType, context);
34+
AnnotatedClass instance2 = AnnotatedClassResolver.resolve(context, beanType, context);
35+
36+
AnnotatedConstructor constructor1 = instance1.getConstructors().get(0);
37+
AnnotatedConstructor constructor2 = instance2.getConstructors().get(0);
38+
39+
assertEquals(instance1, instance2);
40+
assertEquals(constructor1.getAnnotated(), constructor2.getAnnotated());
41+
assertEquals(constructor1, constructor2);
42+
assertEquals(constructor1.getParameter(0), constructor2.getParameter(0));
43+
}
44+
45+
public void testAnnotatedMethodEquality() {
46+
ObjectMapper mapper = new JsonMapper();
47+
DeserializationConfig context = mapper.getDeserializationConfig();
48+
JavaType beanType = mapper.constructType(SomeBean.class);
49+
50+
AnnotatedClass instance1 = AnnotatedClassResolver.resolve(context, beanType, context);
51+
AnnotatedClass instance2 = AnnotatedClassResolver.resolve(context, beanType, context);
52+
53+
String methodName = "setValue";
54+
Class<?>[] paramTypes = {String.class};
55+
AnnotatedMethod method1 = instance1.findMethod(methodName, paramTypes);
56+
AnnotatedMethod method2 = instance2.findMethod(methodName, paramTypes);
57+
58+
assertEquals(instance1, instance2);
59+
assertEquals(method1.getAnnotated(), method2.getAnnotated());
60+
assertEquals(method1, method2);
61+
assertEquals(method1.getParameter(0), method2.getParameter(0));
62+
}
63+
64+
public void testAnnotatedFieldEquality() {
65+
ObjectMapper mapper = new JsonMapper();
66+
DeserializationConfig context = mapper.getDeserializationConfig();
67+
JavaType beanType = mapper.constructType(SomeBean.class);
68+
69+
AnnotatedClass instance1 = AnnotatedClassResolver.resolve(context, beanType, context);
70+
AnnotatedClass instance2 = AnnotatedClassResolver.resolve(context, beanType, context);
71+
72+
AnnotatedField field1 = instance1.fields().iterator().next();
73+
AnnotatedField field2 = instance2.fields().iterator().next();
74+
75+
assertEquals(instance1, instance2);
76+
assertEquals(field1.getAnnotated(), field2.getAnnotated());
77+
assertEquals(field1, field2);
78+
}
79+
80+
}

0 commit comments

Comments
 (0)