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();

Reply via email to