Java CompoundRoot中没有对象具有名为

Java CompoundRoot中没有对象具有名为,java,struts,interceptor,Java,Struts,Interceptor,我正试图通过调用Ajax将数据以Json格式发送到Action。但我得到以下错误 1. No object in the CompoundRoot has a publicly accessible property named 'PersonDetailsAction' (no setter could be found). 2. Error setting expression 'PersonDetailsAction' with value 'actions.PersonDetails

我正试图通过调用
Ajax
将数据以
Json
格式发送到
Action
。但我得到以下错误

1.  No object in the CompoundRoot has a publicly accessible property named 'PersonDetailsAction' (no setter could be found).
2.  Error setting expression 'PersonDetailsAction' with value 'actions.PersonDetailsAction@680e6039'
我的尝试如下:

Struts.xml

<package name="simple" extends="struts-default" namespace="/">

    <interceptors>

        <interceptor name="jsonToPOJO" class="interceptors.FromJsonInterceptor" />

        <interceptor-stack name="jsonToPOJOStack">
            <interceptor-ref name="jsonToPOJO"></interceptor-ref>
        </interceptor-stack>
    </interceptors>
    <action name="PersonDetailAction" class="actions.PersonDetailsAction"
        method="execute">
        <interceptor-ref name="jsonToPOJOStack"></interceptor-ref>
        <result name="success" type="dispatcher">/welcome.html</result>
    </action>
</package>
PersonDetailsAction.java

public class PersonDetailsAction {
    String firstName, lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String execute(){
        return "success";
    }
}
FromJsonInterceptor

public String intercept(ActionInvocation actInvc) throws Exception {
    ServletRequest request = ServletActionContext.getRequest();
    Gson gsonObject = new Gson();
    PersonDetailsAction pdAction;

    pdAction = gsonObject.fromJson(request.getReader(), PersonDetailsAction.class);
    System.out.println(pdAction.getFirstName());
    System.out.println(pdAction.getLastName());
    ValueStack vs = actInvc.getStack();
    vs.setValue("PersonDetailsAction", pdAction);
    return actInvc.invoke();
}
堆栈跟踪:

No object in the CompoundRoot has a publicly accessible property named 'PersonDetailsAction' (no setter could be found). - [unknown location]
com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor.setProperty(CompoundRootAccessor.java:106)
ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2332)
ognl.ASTProperty.setValueBody(ASTProperty.java:127)
ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
ognl.SimpleNode.setValue(SimpleNode.java:301)
ognl.Ognl.setValue(Ognl.java:737)
com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:234)
com.opensymphony.xwork2.ognl.OgnlValueStack.trySetValue(OgnlValueStack.java:183)
com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:170)
com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:164)
com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:157)
interceptors.FromJsonInterceptor.intercept(FromJsonInterceptor.java:38)

我想我纠正了这个问题

前面我正在做的是,在值堆栈中设置
操作
。但是
Action
被推到堆栈中,这就是
ActionContext
的角色

一旦将
操作
推入
值堆栈
,则
操作
的所有属性(至少在外部世界看来)都将成为
值堆栈
的属性,并且可以直接访问

在我的例子中,因为,
Action
已经被推送,所以我需要做的就是
设置Action
的属性值

因此,下面的代码

vs.setValue("PersonDetailsAction", pdAction);
应改为

vs.setValue("firstName", pdAction.getFirstName());
vs.setValue("lastName", pdAction.getLastName());
vs.setValue("firstName", pdAction.getFirstName());
vs.setValue("lastName", pdAction.getLastName());