【问题标题】:java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxyjava.lang.UnsupportedOperationException: 试图序列化 java.lang.Class: org.hibernate.proxy.HibernateProxy
【发布时间】:2023-03-23 23:51:01
【问题描述】:

我正在使用带有 JSF 应用程序的 Restful Web 服务(Jersy 实现)并使用 Json 获取数据,如下所示:

    carObjectDao = new GenericDAO<carObject>(carObject.class);
    List<carObject> allCars = carObjectDao.readAll();
    Gson gson = new Gson();
    String carString = gson.toJson(allCars);
    System.err.println(carString );
    return carString ;

我在调试模式下运行应用程序并且 allCars 正确填充了数据,但之后抛出异常:

java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?

我不知道异常的根本原因

【问题讨论】:

  • 您必须取消代理 HibernateProxy 对象,或者如果您真的不需要数据,只需将 em 设置为 null。
  • 你能解释一下吗,我没明白

标签: json hibernate jakarta-ee jax-rs


【解决方案1】:

这是一个已知问题:Could not serialize object cause of HibernateProxy

JSon 不能反序列化 HibernateProxy 对象,所以你要么取消代理,要么删除 em。

或者,您可以急切地获取惰性数据。

【讨论】:

  • 如何取消代理或删除它们,我读过那篇文章但不明白
  • 拳头你必须了解延迟初始化是如何工作的,当你不急于获取集合或加载对象时,它作为一个 Hibernate 代理集合/对象,你必须从你的 allCars 中找出对象,哪些子集合/对象以 HibernateProxy 的形式出现,而不是真实数据。
  • 之后,您可以决定如何处理 em(删除 em 或修复 em)。
【解决方案2】:

尝试通过ObjectMapper解析为

    carObjectDao = new GenericDAO<carObject>(carObject.class);
    List<carObject> allCars = carObjectDao.readAll();
    String carString = new ObjectMapper().writeValueAsString(allCars);
    System.err.println(carString );
    return carString ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多