From 83ff8e4e98272127de3ba73b7ac53e83a7658149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Olbi=C5=84ski?= Date: Mon, 22 Jul 2024 19:36:35 +0200 Subject: [PATCH] Support JAXBElement subtypes in Jaxb2XmlEncoder Closes gh-33258 --- .../http/codec/xml/Jaxb2XmlEncoder.java | 2 +- .../http/codec/xml/Jaxb2XmlEncoderTests.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java b/spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java index cc15b879639..b5a2b6d4304 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java @@ -93,7 +93,7 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder { Class outputClass = elementType.toClass(); return (outputClass.isAnnotationPresent(XmlRootElement.class) || outputClass.isAnnotationPresent(XmlType.class) || - elementType.isAssignableFrom(JAXBElement.class)); + JAXBElement.class.isAssignableFrom(outputClass)); } else { return false; diff --git a/spring-web/src/test/java/org/springframework/http/codec/xml/Jaxb2XmlEncoderTests.java b/spring-web/src/test/java/org/springframework/http/codec/xml/Jaxb2XmlEncoderTests.java index f04b9aafb74..e7152c43459 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/xml/Jaxb2XmlEncoderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/xml/Jaxb2XmlEncoderTests.java @@ -16,6 +16,7 @@ package org.springframework.http.codec.xml; +import java.io.Serial; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; @@ -43,6 +44,7 @@ import static org.springframework.core.ResolvableType.forClass; import static org.springframework.core.io.buffer.DataBufferUtils.release; /** + * Tests for {@link Jaxb2XmlEncoder}. * @author Sebastien Deleuze * @author Arjen Poutsma */ @@ -64,6 +66,7 @@ class Jaxb2XmlEncoderTests extends AbstractEncoderTests { assertThat(this.encoder.canEncode(forClass(getClass()), MediaType.APPLICATION_XML)).isFalse(); assertThat(this.encoder.canEncode(forClass(JAXBElement.class), MediaType.APPLICATION_XML)).isTrue(); + assertThat(this.encoder.canEncode(forClass(JAXBElementSubclass.class), MediaType.APPLICATION_XML)).isTrue(); // SPR-15464 assertThat(this.encoder.canEncode(ResolvableType.NONE, null)).isFalse(); @@ -122,6 +125,17 @@ class Jaxb2XmlEncoderTests extends AbstractEncoderTests { }; } + public static class JAXBElementSubclass extends JAXBElement { + @Serial + private static final long serialVersionUID = 1L; + + protected static final QName NAME = new QName("http://foo/schema/common/1.0", "Pojo"); + + public JAXBElementSubclass() { + super(NAME, Pojo.class, null, null); + } + } + public static class Model {} public static class Foo extends Model {