Skip to content

Commit 42f5f1d

Browse files
authored
Merge pull request #33924 from Sgitario/33875_good
Support marshalling of JAXBElements in REST Client and Server Reactive
2 parents 15108c1 + a8c3c5a commit 42f5f1d

File tree

4 files changed

+75
-14
lines changed

4 files changed

+75
-14
lines changed

extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/test/java/io/quarkus/resteasy/reactive/jaxb/deployment/test/SimpleXmlTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import java.io.StringWriter;
99

10+
import javax.xml.namespace.QName;
11+
1012
import jakarta.validation.Valid;
1113
import jakarta.validation.constraints.NotBlank;
1214
import jakarta.ws.rs.Consumes;
@@ -18,6 +20,7 @@
1820
import jakarta.ws.rs.container.Suspended;
1921
import jakarta.ws.rs.core.MediaType;
2022
import jakarta.xml.bind.JAXB;
23+
import jakarta.xml.bind.JAXBElement;
2124
import jakarta.xml.bind.annotation.XmlAccessType;
2225
import jakarta.xml.bind.annotation.XmlAccessorType;
2326
import jakarta.xml.bind.annotation.XmlRootElement;
@@ -178,6 +181,19 @@ public void testResourceUsingModelWithSameName() {
178181
.body(is("bb"));
179182
}
180183

184+
@Test
185+
public void testSupportReturningJaxbElement() {
186+
Person response = RestAssured
187+
.get("/simple/person-as-jaxb-element")
188+
.then()
189+
.statusCode(200)
190+
.contentType(ContentType.XML)
191+
.extract().as(Person.class);
192+
193+
assertEquals("Bob", response.getFirst());
194+
assertEquals("Builder", response.getLast());
195+
}
196+
181197
private String toXml(Object person) {
182198
StringWriter sw = new StringWriter();
183199
JAXB.marshal(person, sw);
@@ -246,6 +262,13 @@ public Person getPerson() {
246262
return person;
247263
}
248264

265+
@GET
266+
@Produces(MediaType.APPLICATION_XML)
267+
@Path("/person-as-jaxb-element")
268+
public JAXBElement<Person> getPersonAsJaxbElement() {
269+
return new JAXBElement<>(new QName("person"), Person.class, getPerson());
270+
}
271+
249272
@POST
250273
@Path("/person")
251274
@Produces(MediaType.APPLICATION_XML)

extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/runtime/src/main/java/io/quarkus/resteasy/reactive/jaxb/runtime/serialisers/ServerJaxbMessageBodyWriter.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,15 @@ public void writeResponse(Object o, Type genericType, ServerRequestContext conte
5555

5656
protected void marshal(Object o, OutputStream outputStream) {
5757
try {
58-
Object jaxbObject = o;
5958
Class<?> clazz = o.getClass();
60-
XmlRootElement jaxbElement = clazz.getAnnotation(XmlRootElement.class);
61-
if (jaxbElement == null) {
62-
jaxbObject = new JAXBElement(new QName(Introspector.decapitalize(clazz.getSimpleName())), clazz, o);
59+
Object jaxbObject = o;
60+
if (o instanceof JAXBElement) {
61+
clazz = ((JAXBElement<?>) o).getDeclaredType();
62+
} else {
63+
XmlRootElement jaxbElement = clazz.getAnnotation(XmlRootElement.class);
64+
if (jaxbElement == null) {
65+
jaxbObject = new JAXBElement(new QName(Introspector.decapitalize(clazz.getSimpleName())), clazz, o);
66+
}
6367
}
6468

6569
getMarshall(clazz).marshal(jaxbObject, outputStream);

extensions/resteasy-reactive/rest-client-reactive-jaxb/deployment/src/test/java/io/quarkus/rest/client/reactive/jaxb/test/SimpleJaxbTest.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,18 @@
55
import java.net.URI;
66
import java.util.Objects;
77

8+
import javax.xml.namespace.QName;
9+
10+
import jakarta.ws.rs.Consumes;
811
import jakarta.ws.rs.GET;
12+
import jakarta.ws.rs.POST;
913
import jakarta.ws.rs.Path;
1014
import jakarta.ws.rs.Produces;
1115
import jakarta.ws.rs.core.MediaType;
16+
import jakarta.xml.bind.JAXBElement;
1217
import jakarta.xml.bind.annotation.XmlRootElement;
1318

19+
import org.junit.jupiter.api.BeforeEach;
1420
import org.junit.jupiter.api.Test;
1521
import org.junit.jupiter.api.extension.RegisterExtension;
1622

@@ -26,18 +32,24 @@ public class SimpleJaxbTest {
2632
@TestHTTPResource
2733
URI uri;
2834

35+
XmlClient client;
36+
37+
@BeforeEach
38+
public void setup() {
39+
client = QuarkusRestClientBuilder.newBuilder().baseUri(uri).build(XmlClient.class);
40+
}
41+
2942
@Test
3043
void shouldConsumeXMLEntity() {
31-
var dto = QuarkusRestClientBuilder.newBuilder().baseUri(uri).build(XmlClient.class)
32-
.dto();
33-
assertThat(dto).isEqualTo(new Dto("foo", "bar"));
44+
assertThat(client.dto()).isEqualTo(new Dto("foo", "bar"));
45+
assertThat(client.createDto(new Dto("foo", "bar"))).isEqualTo(new Dto("foo", "bar"));
46+
assertThat(client.createDto(new JAXBElement<>(new QName("Dto"), Dto.class, new Dto("foo", "bar"))))
47+
.isEqualTo(new Dto("foo", "bar"));
3448
}
3549

3650
@Test
3751
void shouldConsumePlainXMLEntity() {
38-
var dto = QuarkusRestClientBuilder.newBuilder().baseUri(uri).build(XmlClient.class)
39-
.plain();
40-
assertThat(dto).isEqualTo(new Dto("foo", "bar"));
52+
assertThat(client.plain()).isEqualTo(new Dto("foo", "bar"));
4153
}
4254

4355
@Path("/xml")
@@ -48,6 +60,18 @@ public interface XmlClient {
4860
@Produces(MediaType.APPLICATION_XML)
4961
Dto dto();
5062

63+
@POST
64+
@Path("/dto")
65+
@Consumes(MediaType.APPLICATION_XML)
66+
@Produces(MediaType.APPLICATION_XML)
67+
Dto createDto(Dto dto);
68+
69+
@POST
70+
@Path("/dto")
71+
@Consumes(MediaType.APPLICATION_XML)
72+
@Produces(MediaType.APPLICATION_XML)
73+
Dto createDto(JAXBElement<Dto> dto);
74+
5175
@GET
5276
@Path("/plain")
5377
@Produces(MediaType.TEXT_XML)
@@ -67,6 +91,14 @@ public String dto() {
6791
return DTO_FOO_BAR;
6892
}
6993

94+
@POST
95+
@Consumes(MediaType.APPLICATION_XML)
96+
@Produces(MediaType.APPLICATION_XML)
97+
@Path("/dto")
98+
public String dto(String dto) {
99+
return dto;
100+
}
101+
70102
@GET
71103
@Produces(MediaType.TEXT_XML)
72104
@Path("/plain")

extensions/resteasy-reactive/rest-client-reactive-jaxb/runtime/src/main/java/io/quarkus/rest/client/reactive/jaxb/runtime/ClientMessageBodyWriter.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,13 @@ private void setContentTypeIfNecessary(MultivaluedMap<String, Object> httpHeader
4646

4747
protected void marshal(Object o, OutputStream outputStream) {
4848
try {
49-
Object jaxbObject = o;
5049
Class<?> clazz = o.getClass();
51-
XmlRootElement jaxbElement = clazz.getAnnotation(XmlRootElement.class);
52-
if (jaxbElement == null) {
53-
jaxbObject = new JAXBElement(new QName(Introspector.decapitalize(clazz.getSimpleName())), clazz, o);
50+
Object jaxbObject = o;
51+
if (!(o instanceof JAXBElement)) {
52+
XmlRootElement jaxbElement = clazz.getAnnotation(XmlRootElement.class);
53+
if (jaxbElement == null) {
54+
jaxbObject = new JAXBElement(new QName(Introspector.decapitalize(clazz.getSimpleName())), clazz, o);
55+
}
5456
}
5557

5658
marshaller.marshal(jaxbObject, outputStream);

0 commit comments

Comments
 (0)