From 47a5ebfde67197ee45fc3a9fd6e102a94a69097d Mon Sep 17 00:00:00 2001 From: Thomas Deblock Date: Fri, 7 Jun 2024 09:25:11 +0200 Subject: [PATCH] Support canEncode() for JAXBElement in Jaxb2XmlEncoder Commit d7970e4ab8 introduced support for JAXBElement in Jaxb2XmlEncoder's encodeValue() method; however, canEncode() still returned false for a JAXBElement element type. This commit revises canEncode() so that it returns true for an element type that is assignable from JAXBElement. See gh-30552 See gh-32972 Closes gh-32977 --- .../org/springframework/http/codec/xml/Jaxb2XmlEncoder.java | 5 +++-- .../springframework/http/codec/xml/Jaxb2XmlEncoderTests.java | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) 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 482909528c7..cc15b879639 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -92,7 +92,8 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder { if (super.canEncode(elementType, mimeType)) { Class outputClass = elementType.toClass(); return (outputClass.isAnnotationPresent(XmlRootElement.class) || - outputClass.isAnnotationPresent(XmlType.class)); + outputClass.isAnnotationPresent(XmlType.class) || + elementType.isAssignableFrom(JAXBElement.class)); } 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 6cde0d5bca8..f04b9aafb74 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 @@ -63,6 +63,8 @@ class Jaxb2XmlEncoderTests extends AbstractEncoderTests { assertThat(this.encoder.canEncode(forClass(TypePojo.class), MediaType.APPLICATION_XML)).isTrue(); assertThat(this.encoder.canEncode(forClass(getClass()), MediaType.APPLICATION_XML)).isFalse(); + assertThat(this.encoder.canEncode(forClass(JAXBElement.class), MediaType.APPLICATION_XML)).isTrue(); + // SPR-15464 assertThat(this.encoder.canEncode(ResolvableType.NONE, null)).isFalse(); }