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 {