[682] Correct the fix for 670 and return the type if the type has already been resolved. Signed-off-by: James R. Perkins <jperkins@ibm.com>
diff --git a/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java b/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java index 47b5187..d83850b 100644 --- a/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java +++ b/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java
@@ -252,7 +252,7 @@ } } - if (resolvedArgs[i] == null || resolvedArgs[i].equals(typeToResolve)) { + if (resolvedArgs[i] == null) { if (typeToSearch instanceof Class) { return Object.class; } @@ -262,6 +262,10 @@ typeToSearch)); } } + // The expected type and the resolved type are the same, simply return the type + if (resolvedArgs[i].equals(typeToResolve)) { + return typeToResolve; + } if (resolvedArgs[i] instanceof ParameterizedType) { resolvedArgs[i] = resolveTypeArguments((ParameterizedType) resolvedArgs[i], typeToSearch); } else if (unresolvedArg instanceof GenericArrayType) {
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 42eb35a..a8a4a92 100644 --- a/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/GenericsTest.java
@@ -52,6 +52,7 @@ import org.eclipse.yasson.defaultmapping.generics.model.GenericArrayClass; import org.eclipse.yasson.defaultmapping.generics.model.GenericTestClass; import org.eclipse.yasson.defaultmapping.generics.model.GenericWithUnboundedWildcardClass; +import org.eclipse.yasson.defaultmapping.generics.model.ListContainer; import org.eclipse.yasson.defaultmapping.generics.model.LowerBoundTypeVariableWithCollectionAttributeClass; import org.eclipse.yasson.defaultmapping.generics.model.MultiLevelExtendedGenericTestClass; import org.eclipse.yasson.defaultmapping.generics.model.MultipleBoundsContainer; @@ -516,14 +517,32 @@ } @Test - public void genericUpperBoundContainer() { - final String expectedJson = "{\"tree\":{\"children\":[{\"children\":[],\"name\":\"child\"}],\"name\":\"parent\"}}"; + public void genericUpperBoundContainer() throws Exception { + final String expectedJson = "{\"tree\":{\"children\":[{\"name\":\"child\"}],\"name\":\"parent\"}}"; final TreeContainer<TreeElement> container = new TreeContainer<>(); final TreeElement parent = new TreeElement("parent"); parent.setChildren(List.of(new TreeElement("child"))); container.setTree(parent); - assertEquals(expectedJson, defaultJsonb.toJson(container)); + // Use a new instance of Jsonb to avoid any caching + try (var jsonb = JsonbBuilder.create()) { + assertEquals(expectedJson, jsonb.toJson(container)); + } + + } + + @Test + public void genericUpperBoundContainerWithListContainer() throws Exception { + final String expectedJson = "{\"list\":[{\"children\":[{\"name\":\"child\"}],\"name\":\"parent\"}]}"; + final ListContainer<TreeElement> container = new ListContainer<>(); + final TreeElement parent = new TreeElement("parent"); + parent.setChildren(List.of(new TreeElement("child"))); + container.setList(List.of(parent)); + + // Use a new instance of Jsonb to avoid any caching + try (var jsonb = JsonbBuilder.create()) { + assertEquals(expectedJson, jsonb.toJson(container)); + } }
diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/ListContainer.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/ListContainer.java new file mode 100644 index 0000000..44b128f --- /dev/null +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/ListContainer.java
@@ -0,0 +1,33 @@ +/* + * Copyright (c) 2025 IBM, Inc. and/or its affiliates. + * + * 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.List; + +/** + * + * @author <a href="mailto:jperkins@ibm.com">James R. Perkins</a> + */ +public class ListContainer<T> { + + private List<T> list; + + public List<T> getList() { + return list; + } + + public void setList(List<T> list) { + this.list = list; + } + +}
diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/TreeElement.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/TreeElement.java index 8668761..36a7f71 100644 --- a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/TreeElement.java +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/TreeElement.java
@@ -12,16 +12,12 @@ package org.eclipse.yasson.defaultmapping.generics.model; -import java.util.ArrayList; -import java.util.List; - /** * @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a> */ -public class TreeElement implements TreeTypeContainer<TreeElement> { +public class TreeElement extends TreeTypeContainer<TreeElement> { private final String name; - private List<TreeElement> children = new ArrayList<>(); public TreeElement(final String name) { this.name = name; @@ -30,12 +26,4 @@ public String getName() { return name; } - - public List<TreeElement> getChildren() { - return children; - } - - public void setChildren(final List<TreeElement> children) { - this.children = children; - } }
diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/TreeTypeContainer.java b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/TreeTypeContainer.java index 120ae73..824a5e5 100644 --- a/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/TreeTypeContainer.java +++ b/src/test/java/org/eclipse/yasson/defaultmapping/generics/model/TreeTypeContainer.java
@@ -17,9 +17,14 @@ /** * @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a> */ -public interface TreeTypeContainer<T extends TreeTypeContainer<T>> { +public class TreeTypeContainer<T extends TreeTypeContainer<T>> { + private List<T> children; - List<T> getChildren(); + public List<T> getChildren() { + return children; + } - void setChildren(List<T> children); + public void setChildren(final List<T> children) { + this.children = children; + } }