錯誤信息:出現java.lang.NoSuchMethodException setUser([LJava.lang.String;)異常
struts2中的UserAction:
1 public class UserAction{
2 private User user;
3 private String name;
4 public void setName(String name){
5 this.name = name;
6 }
7 public String getName(){
8 return name;
9 }
10 public User getUser() {
11 return user;
12 }
13
14
15 public void setUser(User user) {
16 this.user = user;
17 }
18
19 public String execute(){
20 System.println(user.getUsername);
21 }
22
23 }
24
User就兩個屬性:username/password.
這個是開始的struts.xml中的代碼:
<package name="json" extends="json-default">
<action name="save" class="com.aaron.example.action.UserAction">
<result type="json"></result>
</action>
</package>
這個是jQuery代碼:

$(function()
{

var json =
{"user":
{"username":"zhangsan","password":"123"}};//方法1
//json = {"name":"zhanglong"};// 方法2
//json = {"user.username":"zhangsan","user.password":123};//方法3
});
用方法1會出項上述錯誤,方法2和方法3都可行。
原因:
方法2成功的原因是{"name":"zhanglong"}傳遞的是一個名值對,就像是request的parameter.
方法3成功也是一樣的,struts2的OGNL會識別user.username,并把它對應的值"zhangsan"存放到user的username屬性上
方法1失敗是因為傳的名值對是:"user":"{'username':'zhangsan','password','123'}",這樣struts就會你要將"{'username':'zhangsan','password','123'}"這個字符串賦值給user對象,它就會調用setUser(String user)方法(或者是setUser(String[] user)),由于UserAction中沒有這個方法,所以會報錯。
解決方法:
根據jsonplugin官方的文檔,頁面?zhèn)魅氲恼埱蟮腸ontent-type要是application/json,否則json的interceptor不會幫你將json轉換為java對象,這里他忘了說明一點,jsonplugin中只是定義了json的interceptor,并沒有將其放入到package的攔截器棧中,還需要我們自己放入自己的package中。如下:
1 <interceptors>
2 <interceptor-stack name="myDefaultStack">
3 <interceptor-ref name="json"/>
4 <interceptor-ref name="defaultStack"/>
5 </interceptor-stack>
6 </interceptors>
7
8 <default-interceptor-ref name="myDefaultStack"/>
還要設置jquery的ajax請求的content-type和傳遞類型為"POST":
1 $.ajax({
2 type:"POST",
3 data:jsonText,
4 url:"save.action?number=" + Math.random(),
5 contentType:"application/json"
6 });
其中jsonText如下:
1 var jsonText = "{'user':{
2 'username':'zhangsan',
3 'password':'123'
4 }
5 }"
注意,整個jsonText是個字符串,其中的名值對的名要用''包起來,否則會報異常,指出json格式不對。
只有這樣做了后,json攔截器才會幫你做轉換。
還有,如果UserAction中有個userService的話,需要設置action的result的param:
1 <result type="json">
2 <param name="excludeProperties">
3 userService
4 </param>
5 </result>
這樣就不會將userService進行序列化了,或者可以將action中的getUserService()方法去掉。
如果user對象是從hibernate獲取的,可能得到的是一個代理對象,對其進行json序列化時會出錯。解決辦法是為User對象加上@Proxy(lazy=false)注解。