Michael Hum created WW-5070:
-------------------------------

             Summary: JSONResult default root object should be set explicitly, 
rather than from result of ValueStack.peek()
                 Key: WW-5070
                 URL: https://issues.apache.org/jira/browse/WW-5070
             Project: Struts 2
          Issue Type: Improvement
          Components: Core Results
    Affects Versions: 2.5.17
         Environment: Struts 2.5.17
Tomcat 8.0.24
            Reporter: Michael Hum


JSONResult#setRoot() is documented as follows:

{quote}
Sets the root object to be serialized, defaults to the Action
{quote}

This is implemented in {{org.apache.struts2.json.JSONResult#findRootObject}}:

{code:java}
        if (this.root != null) {
            ValueStack stack = invocation.getStack();
            rootObject = stack.findValue(root);
        } else {
            rootObject = invocation.getStack().peek(); // model overrides action
        }
{code}

We have just run into an issue with our application where this expectation did 
not turn out to be true, due to a race condition in some of our custom 
results/interceptors (triggered by multiple requests) that results in the top 
of the stack not being the action. We've mitigated the issue by explicitly 
setting the root for serialization as the action:

{code:java}
@Result(name = FooAction.JSON, type = "json", params = {"root", "#action", 
"noCache", "true", "ignoreHierarchy", "false"}),
{code}

While not a bug triggered by any struts code, it would make more sense in this 
case to explicitly find the action instead of assuming that the top of the 
stack is the action. The ValueStack is able to be manipulated freely by 
developers, so this would guarantee that the default be correct regardless of 
external manipulation.





--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to