This is an automated email from the ASF dual-hosted git repository.
lukaszlenart pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/struts.git
The following commit(s) were added to refs/heads/main by this push:
new 2e01eaa82 WW-5749 fix(rest): write nothing from the XML handlers when
there is no target (#1959)
2e01eaa82 is described below
commit 2e01eaa8270338a579539296cc85e3ebbe27a035
Author: Lukasz Lenart <[email protected]>
AuthorDate: Wed Sep 16 20:04:25 2026 +0200
WW-5749 fix(rest): write nothing from the XML handlers when there is no
target (#1959)
RestActionInvocation hands the content-type handler a null target for a
clean POST, PUT or DELETE under restrictToGet and for a bare HTTP-status
result code. JacksonXmlHandler and JuneauXmlHandler dereferenced it, and
the NullPointerException that invoke() caught became a 500 whose XML body
was the serialised exception. Both now return early on a null target,
as XStreamHandler already does, so the client gets the intended status
with an empty body.
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
---
.../java/org/apache/struts2/rest/handler/JacksonXmlHandler.java | 3 +++
.../java/org/apache/struts2/rest/handler/JuneauXmlHandler.java | 3 +++
.../org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java | 8 ++++++++
.../org/apache/struts2/rest/handler/JuneauXmlHandlerTest.java | 8 ++++++++
4 files changed, 22 insertions(+)
diff --git
a/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonXmlHandler.java
b/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonXmlHandler.java
index cfeddee58..5c8a9ea6f 100644
---
a/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonXmlHandler.java
+++
b/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JacksonXmlHandler.java
@@ -66,6 +66,9 @@ public class JacksonXmlHandler implements
AuthorizationAwareContentTypeHandler {
@Override
public String fromObject(ActionInvocation invocation, Object obj, String
resultCode, Writer stream) throws IOException {
+ if (obj == null) {
+ return null;
+ }
LOG.debug("Converting an object of {} into string",
obj.getClass().getName());
mapper.writeValue(stream, obj);
return null;
diff --git
a/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JuneauXmlHandler.java
b/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JuneauXmlHandler.java
index 277549f6e..c7b2d154c 100644
---
a/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JuneauXmlHandler.java
+++
b/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JuneauXmlHandler.java
@@ -257,6 +257,9 @@ public class JuneauXmlHandler implements
AuthorizationAwareContentTypeHandler {
@Override
public String fromObject(ActionInvocation invocation, Object obj, String
resultCode, Writer stream) throws IOException {
+ if (obj == null) {
+ return null;
+ }
LOG.debug("Converting an object of {} into string",
obj.getClass().getName());
try {
serializer
diff --git
a/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java
b/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java
index fd2bb52d5..01d99b6db 100644
---
a/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java
+++
b/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java
@@ -76,6 +76,14 @@ public class JacksonXmlHandlerTest extends XWorkTestCase {
return target;
}
+ public void testNullTargetWritesNothing() throws Exception {
+ Writer stream = new StringWriter();
+
+ handler.fromObject(ai, null, null, stream);
+
+ assertThat(stream.toString()).isEmpty();
+ }
+
public void testObjectToXml() throws Exception {
// given
SimpleBean obj = new SimpleBean();
diff --git
a/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JuneauXmlHandlerTest.java
b/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JuneauXmlHandlerTest.java
index 78966bf5d..0d44ae485 100644
---
a/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JuneauXmlHandlerTest.java
+++
b/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JuneauXmlHandlerTest.java
@@ -55,6 +55,14 @@ public class JuneauXmlHandlerTest extends XWorkTestCase {
((MockActionInvocation) ai).setInvocationContext(context);
}
+ public void testNullTargetWritesNothing() throws Exception {
+ Writer stream = new StringWriter();
+
+ handler.fromObject(ai, null, null, stream);
+
+ assertThat(stream.toString()).isEmpty();
+ }
+
public void testObjectToXml() throws Exception {
// given
SimpleBean obj = new SimpleBean();