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


偶遇一個問題: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;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import javax.annotation.Resource;
 7 
 8 import org.apache.struts2.json.annotations.JSON;
 9 
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方法(例子中調用authorityServiceauthorities的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     }

3)此外貌似可以通過配置文件的excude和include來指定需要序列化的對象,我沒有自己去試!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM