当前位置: 首页 > 知识库问答 >
问题:

对Gson使用HibernateProxyTypeAdapter后的org.hibernate.lazyInitializationException

董翰池
2023-03-14
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
List<ContratoSolicitudFull> returnValue = 
                    new SomeBL().getData(id, null, null,currentUserId);

Type type = new TypeToken<List<ContratoSolicitudFull>>() {}.getType();
    Gson gson = new GsonBuilder()
            .registerTypeAdapter(DateTime.class, new DateTimeJsonConverter())
            .registerTypeAdapter(LocalDate.class, new LocalDateJsonConverter())
            .registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY)
            .create();
    String jsonValue = gson.toJson(returnValue, type); //Here is where it fail

你知道吗?

共有1个答案

狄易安
2023-03-14

通过序列化到json,您可以在会话上下文之外访问未受腐蚀的数据

如果您使用的代码与链接中的代码完全相同,请尝试将write方法更改为此方法。

@SuppressWarnings({"rawtypes", "unchecked"})
    @Override
    public void write(JsonWriter out, HibernateProxy value) throws IOException {
        //avoid serializing non initialized proxies
        if (value == null || !Hibernate.isInitialized(value)) {
            out.nullValue();
            return;
        }
        // Retrieve the original (not proxy) class
        Class<?> baseType = Hibernate.getClass(value);
        // Get the TypeAdapter of the original class, to delegate the serialization
        TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType));
        // Get a filled instance of the original class
        Object unproxiedValue = ((HibernateProxy) value).getHibernateLazyInitializer()
                .getImplementation();
        // Serialize the value
        delegate.write(out, unproxiedValue);
    } 

添加!hibernate.isinitialized(value)是为了检查集合是否已初始化,如果没有,则避免访问它。

 类似资料:
  • 我有一个这样的JSON文件: 如何使用Gson仅解析“数据”部分?我的想法是将JSON读入地图,然后用我在GSON中的键“数据”解析普通JSON内容。我能做些更优雅的事吗?

  • 问题内容: 我想将此对象序列化为JSON字符串 并获得如下结果: 我尝试使用 但是相反,我得到了: 人员序列化器: 欢迎任何建议 谢谢,马里奥 问题答案: 为了获得所需的结果,您需要像这样编写串行器: 的结果 将会 完整的代码:

  • 问题内容: 我正在使用Android应用程序中的API,所有JSON响应均如下所示: 问题是,我所有的POJO有,字段,里面领域是真正的POJO我想要的。 有什么方法可以创建Gson的自定义转换器以始终提取字段,因此改造会返回适当的POJO? 问题答案: 您将编写一个自定义反序列化器,该反序列化器返回嵌入的对象。 假设您的JSON是: 然后,您将获得一个POJO: 然后编写一个反序列化器: 现在,

  • 问题内容: 我有一个像这样的JSON对象: 并尝试与Gson解析: 但是“ responceBean”始终为“ null” 这是所有其他类: 这是我的最新尝试。我不知何故找不到正确的方法。任何帮助将不胜感激。 问题答案: 您的 JSON模型与您的对象模型不匹配 。 您需要一个中间层来填补空白: TypeAdapter 。 而且,没有用户的命名信息。 最后是名称不匹配:JSON中的“ worklog

  • 我想将以下字符串作为json发布到服务器。 {“FirstName”:“John”,“LastName”:“Smith”},{“FirstName”:“John”,“LastName”:“Smith”} 但是如果我使用下面的代码,我会得到json对象的数组列表。 输出: [{"FirstName":"John","LastName":"Smith" }, { "FirstName":"John",

  • 有什么方法可以创建一个Gson的自定义转换器来提取字段,从而使regetfit返回appipiate POJO吗?