Skip to content

Commit 95e87f4

Browse files
yaohaishiWillemJiang
authored andcommitted
[SCB-669] add extra hashcode into CtTypeJavaType to avoid deserialization problem
1 parent e981fcc commit 95e87f4

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/CtTypeJavaType.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
*/
1717
package org.apache.servicecomb.common.javassist;
1818

19+
import java.util.Objects;
20+
1921
import com.fasterxml.jackson.databind.type.SimpleType;
22+
import com.fasterxml.jackson.databind.type.TypeBindings;
2023

2124
/**
2225
* just a wrapper for CtType
@@ -28,7 +31,9 @@ public class CtTypeJavaType extends SimpleType {
2831
private CtType type;
2932

3033
public CtTypeJavaType(CtType type) {
31-
super(CtTypeJavaType.class);
34+
super(CtTypeJavaType.class, TypeBindings.emptyBindings(), null, null,
35+
type == null ? 0 : type.getGenericSignature().hashCode(),
36+
null, null, false);
3237
this.type = type;
3338
}
3439

@@ -46,9 +51,20 @@ public String getGenericSignature() {
4651
return type.getGenericSignature();
4752
}
4853

49-
5054
@Override
5155
public StringBuilder getGenericSignature(StringBuilder sb) {
5256
return sb.append(type.getGenericSignature());
5357
}
58+
59+
@Override
60+
public boolean equals(Object o) {
61+
if (this == o) {
62+
return true;
63+
}
64+
if (o == null || !this.getClass().isAssignableFrom(o.getClass())) {
65+
return false;
66+
}
67+
CtTypeJavaType that = (CtTypeJavaType) o;
68+
return Objects.equals(this.getGenericSignature(), that.getGenericSignature());
69+
}
5470
}

common/common-javassist/src/test/java/org/apache/servicecomb/common/javassist/TestCtTypeJavaType.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,45 @@ public void getGenericSignature() {
4545
Assert.assertEquals("Ljava/util/List<Lorg/apache/servicecomb/common/javassist/TestCtTypeJavaType;>;",
4646
listJavaType.getGenericSignature());
4747
}
48+
49+
/**
50+
* The {@link CtTypeJavaType} with different CtType should holds different hash code.
51+
*/
52+
@Test
53+
public void testHashCode() {
54+
JavaType newJavaType = TypeFactory.defaultInstance().constructType(String.class);
55+
CtType newCtType = new CtType(newJavaType);
56+
CtTypeJavaType newCtTypeJavaType = new CtTypeJavaType(newCtType);
57+
Assert.assertNotEquals(ctTypeJavaType.hashCode(), newCtTypeJavaType.hashCode());
58+
59+
newJavaType = TypeFactory.defaultInstance().constructType(cls);
60+
newCtType = new CtType(newJavaType);
61+
newCtTypeJavaType = new CtTypeJavaType(newCtType);
62+
Assert.assertEquals(ctTypeJavaType.hashCode(), newCtTypeJavaType.hashCode());
63+
}
64+
65+
/**
66+
* The {@link CtTypeJavaType}s holding different type information should not equal to each others.
67+
* While those holding the same type information should be equal.
68+
*/
69+
@Test
70+
public void testEquals() {
71+
JavaType newJavaType = TypeFactory.defaultInstance().constructType(String.class);
72+
CtType newCtType = new CtType(newJavaType);
73+
CtTypeJavaType newCtTypeJavaType = new CtTypeJavaType(newCtType);
74+
Assert.assertNotEquals(ctTypeJavaType, newCtTypeJavaType);
75+
76+
newJavaType = TypeFactory.defaultInstance().constructType(cls);
77+
newCtType = new CtType(newJavaType);
78+
newCtTypeJavaType = new CtTypeJavaType(newCtType);
79+
Assert.assertEquals(ctTypeJavaType, newCtTypeJavaType);
80+
81+
// test subClass of CtTypeJavaType
82+
newJavaType = TypeFactory.defaultInstance().constructType(cls);
83+
newCtType = new CtType(newJavaType);
84+
newCtTypeJavaType = new CtTypeJavaType(newCtType) {
85+
private static final long serialVersionUID = 1876189050753964880L;
86+
};
87+
Assert.assertEquals(ctTypeJavaType, newCtTypeJavaType);
88+
}
4889
}

0 commit comments

Comments
 (0)