`

Hibernate对象json序列化失败

 
阅读更多

转自:http://09572.iteye.com/blog/1969436

在使用Spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例:

Java代码  收藏代码
  1. @RequestMapping("login")  
  2.     @ResponseBody  
  3.     public Object login(@RequestParam String username,@RequestParam String password){  
  4.         List<User> list=userDAO.findByUsername(username);  
  5.         if(list.size()>0){  
  6.             User user=list.get(0);  
  7.             if(user.getPassword().equals(password)){  
  8.                 return new Result(user, "操作成功", true);  
  9.             }else{  
  10.                 return new Result(null, "密码错误", true);  
  11.             }  
  12.         }else{  
  13.             return new Result(null, "用户未注册", false);  
  14.         }  
  15.     }  

 客户端抛出org.hibernate.LazyInitializationException异常。通过查询资料和摸索整理出三种解决方法:

第一种:(推荐)

在web.xml中加入:

Xml代码  收藏代码
  1. <filter>  
  2.         <filter-name>openSession</filter-name>  
  3.         <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>singleSession</param-name>  
  6.             <param-value>false</param-value>  
  7.         </init-param>  
  8.     </filter>  
  9.     <filter-mapping>  
  10.         <filter-name>openSession</filter-name>  
  11.         <url-pattern>/*</url-pattern>  
  12.     </filter-mapping>  

 这样返回的Spring mvc返回的Json串也包含一对多关系中的对象,不过都是空的。

Js代码  收藏代码
  1. {"message":"操作成功","results":{"language":null,"id":"402881e6421e40b601421e4111c60001","type":null,"extra":null,"time":null,"username":"wanggang","msg":null,"password":"138333","tag":null,"tel":null,"qq":null,"email":null,"gender":null,"lat":null,"lang":null,"point":null,"openid":null,"city":null,"photo":null,"notes":[],"chatsForUserTwoId":[],"attentionsForUserId":[],"attentionsForAttentionUserId":[],"logs":[],"chatsForUserOneId":[],"commentsForNoteId":[],"commentsForUserId":[]},"success":true}  

 第二种方法(推荐):

在一对多的关系中加@JsonIgnore,这样Jackson在转换的时候就会过滤掉这个对象:

Java代码  收藏代码
  1. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")  
  2. @JsonIgnore  
  3. public Set<Log> getLogs() {  
  4.     return this.logs;  
  5. }  
  6.   
  7. public void setLogs(Set<Log> logs) {  
  8.     this.logs = logs;  
  9. }  

 第三种方式:

把fetch模式配置成“FetchType.EAGER”,这样的方式可以解决问题,但是这样的方式会强制提取一对多关系中的数据,生成很多无用数据,也会增加系统负担,所以不建议采用。

Java代码  收藏代码
  1. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")  
  2.     public Set<Log> getLogs() {  
  3.         return this.logs;  
  4.     }  
  5.   
  6.     public void setLogs(Set<Log> logs) {  
  7.         this.logs = logs;  
  8.     }  
分享到:
评论

相关推荐

    springmvc+spring+hibernate+json文件

    在Java中,可以使用Jackson、Gson等库来序列化和反序列化Java对象为JSON格式,以便于网络传输。 结合这四个技术,开发者可以创建出高性能、模块化的Web应用程序。Spring MVC处理HTTP请求,调用由Spring管理的业务...

    springmvc_hibernate+json lib包

    在Web服务和前后端交互中,JSON经常被用来传输数据,因为它能快速地序列化和反序列化Java对象,使得数据传输更高效。 在这个lib包中,我们可以期待找到Spring MVC、Hibernate和JSON处理的相关库文件,如: 1. ...

    JSON--List集合转换成JSON对象详解

    这是因为在进行JSON序列化时,Hibernate的关联关系可能会导致异常。 4. JSON过滤配置: 在将集合转换为JSON时,可能会有一些不必要的数据或属性需要过滤掉。文中提到使用JsonConfig来设置JsonPropertyFilter,这样...

    springMVC+hibernate+json框架整套jar包,亲测

    1. **Jackson** 或 **Gson**:Java 库,用于 Java 对象与 JSON 字符串之间的序列化和反序列化。 2. **Ajax**:异步 JavaScript 和 XML 技术,常与 JSON 结合,实现前后端无刷新通信。 3. **RESTful API**:使用 ...

    JSON.rar_JSON Hibernate_extjs_json struts ext_jsp json extjs_str

    在这个项目中,开发者可能会遇到如何配置Struts2的JSON结果类型、如何在Hibernate中序列化和反序列化JSON对象、如何在ExtJS中解析和展示JSON数据等问题。理解并熟练掌握这些技术的集成和使用,对于开发高效、响应式...

    struts2,spring,hibernate,json无敌jar包组合

    尽管没有直接提供JSON相关的jar包,但Spring和Struts2都支持JSON序列化和反序列化,可以方便地与前端进行数据交互。 5. **其他依赖**:`commons-collections-3.2.1.jar`是Apache Commons Collections库,提供了丰富...

    hibernate-json:Json 用户类型Hibernate

    选择一个合适的库,用于将Java对象转换为JSON字符串,并从JSON字符串反序列化回Java对象。 3. **序列化和反序列化**:在`nullSafeGet()`方法中,你需要从ResultSet获取JSON字符串,然后使用选定的JSON库将其反序列...

    java序列化对象的存储和读取共6页.pdf.zip

    - JSON序列化库如Gson、Jackson、Fastjson等,可以将Java对象转换为JSON字符串,实现数据的存储和传输。 总之,Java序列化是Java开发中一个重要的概念,它在对象的存储、网络通信和分布式系统中发挥着关键作用。...

    java常用jar包spring struts hibernate mysql json 等

    在Java中,可以使用org.json或com.google.gson等库进行JSON对象的序列化和反序列化,方便数据在网络间传输和在不同系统间共享。 这些库的组合使用,可以构建一个完整的Java Web应用程序,从数据存储(MySQL)、持久...

    序列化与持久化相同点跟不同点

    或者使用XML、JSON等方式将对象序列化后存储在文件中。 4. **性能考量:** - **序列化**过程中可能会消耗较多的计算资源,尤其是当对象图很大时。 - **持久化**除了要考虑数据的存储效率外,还需要考虑查询性能等...

    List对象转JSON对象jar包

    2. **ezmorph-1.0.6.jar**:ezmorph库主要用于对象转换,虽然它的主要目的是将Java对象转换为其他形式,但它也是Json-lib的依赖,因为ezmorph提供了对复杂类型转换的支持,这对JSON序列化和反序列化很有帮助。...

    jackson-datatype-hibernate, 用于处理Hibernate的Jackson JSON处理器模块( http,Add.zip

    jackson-datatype-hibernate, 用于处理Hibernate的Jackson JSON处理器模块( http,Add 构建 Jackson 模块( jar ) 以支持JSON序列化和反序列化 Hibernate ( http://hibernate.org ) 特定数据类型和属性,特别是延迟...

    J-JSon:用于 JSON 序列化反序列化的 Java 库

    J-JSon是一个专门为Java开发的JSON序列化和反序列化的库,它提供了简单易用的API,使得开发者能够快速地将Java对象转换为JSON字符串,或者将JSON文本解析为Java对象。 在Java中,序列化是将对象转化为可存储或传输...

    jackson 使用方法(序列化效率很高)

    Jackson是Java领域中广泛使用的JSON处理库,以其高效、灵活的序列化和反序列化功能而闻名。在本文中,我们将深入探讨...通过合理使用其提供的注解、API和模块,我们可以构建出高性能的JSON序列化和反序列化解决方案。

    json转换工具jackson

    Jackson是Java领域中处理JSON的主流库之一,由 FasterXML 组织开发,提供了高效且灵活的JSON序列化和反序列化功能。本文将深入探讨Jackson作为JSON转换工具的关键知识点,并基于提供的博文链接进行补充。 1. **...

    Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2+json+junit4所有的jar包大集合

    Java提供了多个库,如org.json或Jackson,来处理JSON对象的序列化和反序列化。 **JUnit4** 是Java领域广泛使用的单元测试框架,它极大地简化了测试代码的编写,引入了注解和测试套件等概念,使测试过程更加高效和...

    JSON死循环解决办法

    在使用Hibernate这样的ORM框架时,由于其懒加载机制,可能会遇到JSON序列化时的死循环问题。这是因为CGLIB动态代理生成的对象在序列化时会递归地尝试序列化所有关联的对象,如果对象之间存在循环引用,就会导致无限...

    json对象封装及解析所需的JAR包

    `json-lib-2.4-jdk15.jar`是Json-lib库的一个版本,它是一个Java API,提供了将Java对象转换为JSON格式和从JSON反序列化回Java对象的功能。Json-lib支持多种Java类库,包括Hibernate、JavaBeans、JDOM、Jakarta ...

Global site tag (gtag.js) - Google Analytics