struts2输出JSON

来源:互联网 发布:python的函数参数传递 编辑:程序博客网 时间:2024/04/27 17:43

S2SH中使用json,控制台报错:

2013-01-10 18:11:16,212 ERROR [org.hibernate.LazyInitializationException] - failed to lazily initialize a collection of role: com.xuedou.skypas.bean.Proclass.projects, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.xuedou.skypas.bean.Proclass.projects, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
at org.hibernate.collection.PersistentSet.equals(PersistentSet.java:429)
at java.util.Vector.indexOf(Vector.java:361)
at java.util.Vector.contains(Vector.java:320)
at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:114)
at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:329)
at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:228)
at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:165)
at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:131)
at org.apache.struts2.json.JSONWriter.array(JSONWriter.java:418)
at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:155)
at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:131)
at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:329)
at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:228)
at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:165)
at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:131)
at org.apache.struts2.json.JSONWriter.write(JSONWriter.java:99)
at org.apache.struts2.json.JSONUtil.serialize(JSONUtil.java:112)
at org.apache.struts2.json.JSONResult.execute(JSONResult.java:198)
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:362)

说:no session or session was closed

解决办法:在实体Bean 一对多的对象get,set 这里。 在get前加@JSON(serialize=false)。(或者在excludeProperties里排除掉相关联的对象)

如:

private Set<Project> projects;//映射的对象@JSON(serialize=false)   //加上这个public Set<Project> getProjects() {return projects;}


struts2中运用json主要几步:

1.struts.xml中 package需要继承json-default

2.result 中 ,需要指定json类型,<result name="success" type="json"></result>


 

扩充:

struts2的json响应param类型的几种:

root:只包含xx对象excludeProperties  :除了xx之外的集合includeProperties : 包含xx的集合wrapPrefix :json结果开头添加xx(比如<paramname="wrapPrefix">[</param>)wrapSuffix :同上,只不过是结尾ignoreHierarchy :转化时是否忽略继承关系true/falseenumAsBean : 是否将枚举当做一个bean处理enableGZIP :是否支持gzip压缩输出noCache :是否缓存excludeNullProperties : 是否转化输出 null值statusCode :设置响应代号比如 304callbackParameter : JSONP跨域访问的回调设置contentType : 输出类型

JSON输出时,会把Action中的所有变量( get(),set() ) 的值也同时输出,最好是指定某个集合 如:<param name="root">proclassList<param>

例如:<param name="includeProperties">proclassList\[\d+\]\.id,proclassList\[\d+\]\.proclassname</param>  取得proclassList集合中的proclassname


案例需求一:想得到teacherVO这个类中的list和count两个属性值

 <result name="teachersByGSC" type="json"> <param name="root">teacherVO</param> <param name="includeProperties">list.*,count</param> <param name="excludeProperties"> SUCCESS, list\[\d+\]\.FamousStatus, list\[\d+\]\.Flag, list\[\d+\]\.SortOrder, list\[\d+\]\.TeamStatus </param> </result>
其中excludeProperties中SUCCESS表示只要排除所有的属性(当然出了list,count),然后在单单排除list里不想要的值


参考文档:

http://struts.apache.org/2.2.3/docs/json-plugin.html (官方文档)

http://qiaolevip.iteye.com/blog/1335069

原创粉丝点击