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