diff --git a/src/main/java/org/eclipse/yasson/internal/VariableTypeInheritanceSearch.java b/src/main/java/org/eclipse/yasson/internal/VariableTypeInheritanceSearch.java index 08e63cd56..bcffc307b 100644 --- a/src/main/java/org/eclipse/yasson/internal/VariableTypeInheritanceSearch.java +++ b/src/main/java/org/eclipse/yasson/internal/VariableTypeInheritanceSearch.java @@ -96,7 +96,7 @@ private Type checkSubclassRuntimeInfo(TypeVariable typeVar) { private Type searchRuntimeTypeArgument(ParameterizedType runtimeType, TypeVariable typeVar) { if (ReflectionUtils.getRawType(runtimeType) != typeVar.getGenericDeclaration()) { - return ReflectionUtils.getOptionalRawType(typeVar).filter(rawType -> !Object.class.equals(rawType)).orElse(null); + return null; } TypeVariable[] bounds = typeVar.getGenericDeclaration().getTypeParameters(); for (int i = 0; i < bounds.length; i++) { diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java index 242ccbba8..becfc3af2 100644 --- a/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -12,6 +12,8 @@ package org.eclipse.yasson.defaultmapping.generics; +import org.eclipse.yasson.defaultmapping.generics.model.FinalMember; +import org.eclipse.yasson.defaultmapping.generics.model.FinalGenericWrapper; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; import static org.eclipse.yasson.Jsonbs.*; @@ -428,6 +430,20 @@ public void collectionWrapperTest() { String s = defaultJsonb.toJson(collectionWrapper); } + @Test + public void multipleGenericLevels() { + FinalMember member = new FinalMember(); + member.setName("Jason"); + FinalGenericWrapper concreteContainer = new FinalGenericWrapper(); + concreteContainer.setMember(member); + + String expected = "{\"member\":{\"name\":\"Jason\"}}"; + Jsonb jsonb = JsonbBuilder.create(); + assertEquals(expected, jsonb.toJson(concreteContainer)); + FinalGenericWrapper finalGenericWrapper = jsonb.fromJson(expected, FinalGenericWrapper.class); + assertEquals(concreteContainer, finalGenericWrapper); + } + public interface FunctionalInterface { T getValue(); } diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/AbstractGenericWrapper.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/AbstractGenericWrapper.java new file mode 100644 index 000000000..61149c511 --- /dev/null +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/AbstractGenericWrapper.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, + * or the Eclipse Distribution License v. 1.0 which is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + */ + +package org.eclipse.yasson.defaultmapping.generics.model; + +import java.util.Objects; + +public abstract class AbstractGenericWrapper { + + T member; + + public T getMember() { + return member; + } + + public void setMember(T member) { + this.member = member; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AbstractGenericWrapper that = (AbstractGenericWrapper) o; + return Objects.equals(member, that.member); + } + + @Override + public int hashCode() { + return Objects.hash(member); + } +} diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/AbstractMember.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/AbstractMember.java new file mode 100644 index 000000000..534109f52 --- /dev/null +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/AbstractMember.java @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, + * or the Eclipse Distribution License v. 1.0 which is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + */ + +package org.eclipse.yasson.defaultmapping.generics.model; + +public class AbstractMember { +} diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/FinalGenericWrapper.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/FinalGenericWrapper.java new file mode 100644 index 000000000..12bec00d6 --- /dev/null +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/FinalGenericWrapper.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, + * or the Eclipse Distribution License v. 1.0 which is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + */ + +package org.eclipse.yasson.defaultmapping.generics.model; + +public class FinalGenericWrapper extends MiddleGenericWrapper { + +} diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/FinalMember.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/FinalMember.java new file mode 100644 index 000000000..47ee0fdd2 --- /dev/null +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/FinalMember.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, + * or the Eclipse Distribution License v. 1.0 which is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + */ + +package org.eclipse.yasson.defaultmapping.generics.model; + +import java.util.Objects; + +public class FinalMember extends AbstractMember { + String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FinalMember that = (FinalMember) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } +} diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/MiddleGenericWrapper.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/MiddleGenericWrapper.java new file mode 100644 index 000000000..01ea21009 --- /dev/null +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/MiddleGenericWrapper.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, + * or the Eclipse Distribution License v. 1.0 which is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + */ + +package org.eclipse.yasson.defaultmapping.generics.model; + +public abstract class MiddleGenericWrapper extends AbstractGenericWrapper { + +}