Browse Source

Support JAXBElement subtypes in Jaxb2XmlEncoder

Closes gh-33258
pull/33365/head
Dawid Olbiński 2 years ago committed by Brian Clozel
parent
commit
83ff8e4e98
  1. 2
      spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java
  2. 14
      spring-web/src/test/java/org/springframework/http/codec/xml/Jaxb2XmlEncoderTests.java

2
spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java

@ -93,7 +93,7 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder<Object> { @@ -93,7 +93,7 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder<Object> {
Class<?> outputClass = elementType.toClass();
return (outputClass.isAnnotationPresent(XmlRootElement.class) ||
outputClass.isAnnotationPresent(XmlType.class) ||
elementType.isAssignableFrom(JAXBElement.class));
JAXBElement.class.isAssignableFrom(outputClass));
}
else {
return false;

14
spring-web/src/test/java/org/springframework/http/codec/xml/Jaxb2XmlEncoderTests.java

@ -16,6 +16,7 @@ @@ -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; @@ -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<Jaxb2XmlEncoder> { @@ -64,6 +66,7 @@ class Jaxb2XmlEncoderTests extends AbstractEncoderTests<Jaxb2XmlEncoder> {
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<Jaxb2XmlEncoder> { @@ -122,6 +125,17 @@ class Jaxb2XmlEncoderTests extends AbstractEncoderTests<Jaxb2XmlEncoder> {
};
}
public static class JAXBElementSubclass extends JAXBElement<Pojo> {
@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 {

Loading…
Cancel
Save