struts2的json插件导致数据返回到页面时发生懒加载错误。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2的json插件导致数据返回到页面时发生懒加载错误。相关的知识,希望对你有一定的参考价值。
我请求的是一对多和多对一双关联关系的对象集合。比如说Province与country多对一双向关联,又与University一对多双向关联,还与city一对多双向关联,向action请求的是List provinceList = ...getResult(); jsp向action请求数据能够接收到,而ajax向action请求时让struts2的json插件自动将数据转换为json类型返回却接受到一个懒加载错误。这个问题纠结我两天了,我需要一个高手给予解答。我知道手工转换成json就可以,但我偏要用struts2的json插件自动转换,这样代码会简单很多,可为啥会懒加载错误?
参考技术A 在涉及到多表查询时,会出现的情况,详细可参考hibernate中session的生命周期中有谈到,这里就不详谈了,解决方法是在设置多对一时,加上:lazy=false;就可以了。 参考技术B 你好!第一种:使用json-lib的JsonConfig的setJsonPropertyFilter(PropertyFilter
jsonPropertyFilter)方法对关联的属性进行过滤,你看你所用的Struts2插件中是否有类似的方法
第二种:将HIbernate中默认的fetch属性设置为eager
我的回答你还满意吗~~
struts返回json数据
想要在struts中返回json格式数据有两种办法。
1.使用servlet的输出流
实际上就是在struts中获取response对象的输出流。然后写入你要返回的json数据,本质和用servlet返回json数据是一样的,需要自己导入json的jar包。不做详细介绍。
2.试用struts对json的扩展
这里需要两个jar包,xwork-core-2.1.6.jar和struts2-json-plugin-2.1.8.jar。如果是用MyEclipse注入的struts环境就不需要手动了。下面以一个例子讲解。
1 package action; 2 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 7 import org.apache.struts2.json.annotations.JSON; 8 9 import com.opensymphony.xwork2.ActionSupport; 10 11 import entity.Outbox; 12 import util.DaoFactory; 13 14 public class SendBoxJson extends ActionSupport { 15 private static final long serialVersionUID = 1L; 16 private Map<String,Object> data; 17 private String state; 18 19 private String userId; 20 private String searchType; 21 private String keyValue; 22 private String start; 23 private String end; 24 25 26 27 28 29 public Map getData() { 30 return data; 31 } 32 33 public String getState() { 34 return state; 35 } 36 37 38 public void setUserId(String userId) { 39 this.userId = userId; 40 } 41 42 public void setSearchType(String searchType) { 43 this.searchType = searchType; 44 } 45 46 public void setKeyValue(String keyValue) { 47 this.keyValue = keyValue; 48 } 49 50 public void setStart(String start) { 51 this.start = start; 52 } 53 54 public void setEnd(String end) { 55 this.end = end; 56 } 57 58 public String getJson() throws Exception { 59 List<Outbox> list = DaoFactory.getOutBoxDaoInstance().getOutMails(userId, searchType, keyValue, start, end); 60 state="success"; 61 data=new HashMap<String,Object>(); 62 data.put("data", list); 63 data.put("state",state); 64 System.out.println(data); 65 return "heihei"; 66 } 67 }
上面的是一个普通的struts类,没什么特殊之处。重点在struts的配置文件中。
1 <package name="json" namespace="/" extends="struts-default,json-default"> 2 <action name="json" class="action.SendBoxJson" method="getJson"> 3 4 <result name="heihei" type="json"> 5 6 <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 --> 7 <param name="root">data</param> 8 <!-- 指定是否序列化空的属性 --> 9 <param name="excludeNullProperties">true</param> 10 <!-- 这里指定将序列化list中的那些属性 --> 11 <!-- <param name="includeProperties">data.*</param> --> 12 <!-- 这里指定将要从list中排除那些属性,这些排除的属性将不被序列化,一般不与上边的参数配置同时出现 --> 13 <!-- <param name="excludeProperties">id</param> --> 14 </result> 15 </action> 16 </package>
在配置中,首先需要action所在的package继承了json-default,或者继承的父包继承了json-default。然后result里多了个type=“json”这是说明返回的是json字符串。
<param name="root">data</param>要讲data这个变量序列化后返回,data是上面struts类中一个变量。
注意如果data类型为list,需要使用
<param name="includeProperties">data.*</param>来指定,否则返回的json字符串会为空。
如果想要忽略对象的某个属性,可在属性的get方法加@JSON(serialize=false) ,常用在hibernate的实体中,如果返回的是hibernate实体,该实体又用到了另一个实体,就会因为懒加载的原因序列化失败(自行百度),就需要在某些属性加上上面的注释。
上面的set是一对多关系的表示.
以上是关于struts2的json插件导致数据返回到页面时发生懒加载错误。的主要内容,如果未能解决你的问题,请参考以下文章
Struts2+Jquery实现ajax并返回json类型数据
Struts2+Jquery实现ajax并返回json类型数据
struts2中,jsp页面通过ajax访问了action,action如何返回一个json数据给这个jsp页面,
如何在 Struts 2 中使用 JSP 返回 JSON 结果
struts2使用json返回数据,报错:Parent package is not defined: json-default - [unknown location]