org.apache.struts2.json.JSONWriter can not access a member of class

轉自:http://www.cnblogs.com/xiaoyaorensheng/archive/2013/01/02/2842302.html 

偶遇一個問題:org.apache.struts2.json.JSONWriter can not access a member of class 
org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 
with modifiers "public"。困擾了半天,找到了解決方案,寫寫自己的一些理解。 

action代碼: 


1 package edu.bjfu.action; 

3 import java.util.ArrayList; 
4 import java.util.List; 

6 import javax.annotation.Resource; 

8 import org.apache.struts2.json.annotations.JSON; 

10 
11 import com.opensymphony.xwork2.ActionSupport; 
12 
13 import edu.bjfu.entity.Authority; 
14 import edu.bjfu.service.AuthorityService; 
15 
16 public class AuthoritiesAction extends ActionSupport{ 
17     private AuthorityService authorityService; 
18     private List<Authority> authorities; 
19 
20     public List<Authority> getAuthorities() { 
21         return authorities; 
22     } 
23 
24     public void setAuthorities(List<Authority> authorities) { 
25         this.authorities = authorities; 
26     } 
27     public AuthorityService getAuthorityService() { 
28         return authorityService; 
29     } 
30 
31     @Resource(name="authorityService") 
32     public void setAuthorityService(AuthorityService authorityService) { 
33         this.authorityService = authorityService; 
34     } 
35     
36     public String execute() throws Exception { 
37         authorities=authorityService.getAllAuthorities(); 
38         return SUCCESS; 
39     } 
40     
41 } 



配置文件代碼: 

1 <package name="super_admin" extends="json-default" namespace="/superadmin"> 
2         <action name="allAuthorities" class="edu.bjfu.action.AuthoritiesAction"> 
3             <result type="json"></result> 
4         </action> 
5 </package> 
ajax交互代碼: 


1 $(function(){ 
2     $.post("superadmin/allAuthorities?dt="+new Date().getTime(), 
3         function(data){ 
4             $("#authority").empty(); 
5             var json = eval(data); 
6             for(var i=0;i<json.length;i++){ 
7                 $("#authority").append("<option value='"+json[i].authorityId+"'>"+json[i].authorityName+"</option>"); 
8             } 
9         },"json") 
10 }) 

這樣每次在交互的時候就會發生以上錯誤。 

主要原因:struts會將action中定義的一些變量序列化轉換成json格式,需要調用對象的一系列get方法(例子中調用authorityService和authorities的get方法),並調用以上兩個變量的成員變量的get方法將其內容組成json格式。但是在序列化authorityService時,由於其成員變量中含有含有接口所以會報錯。 

解決方案: 

1)修改配置文件:指定序列化的根節點,這樣data就是從authorities的根節點以下的數據,不需要用data.authorities 

1     <package name="super_admin" extends="json-default" namespace="/superadmin"> 
2         <action name="allAuthorities" class="edu.bjfu.action.AuthoritiesAction"> 
3             <result type="json"><param name="root">authorities</param></result> 
4         </action> 
5     </package> 
2) 修改java代碼:讓編譯器不對authorityService序列化 

1     @JSON(serialize=false) 
2     public AuthorityService getAuthorityService() { 
3         return authorityService; 
4     }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章