【问题标题】:Hibernate retrieved objects to Json using GSONHibernate 使用 GSON 将对象检索到 Json
【发布时间】:2013-09-17 13:51:31
【问题描述】:

我使用 Spring MVC + Hibernate 开发了这个 webapp。

我在 Service 中检索我的所有对象,然后将它们直接返回给控制器。这些对象通常是延迟初始化的,所以集合是空的。

所以对于对象用户:

User
{
   int idUser;
   City city;
   String name;
   List<User> friends;
}

我返回一个只有 idUser 和 name 的对象,City 和 Friends 没有初始化。

我想利用我所有的服务方法(不修改它们)来提供一个 REST api,所以如果我从我的 ApiController 请求获取 id 为 1 的用户,我会以 JSON 格式检索有关该用户的所有有用信息。

我尝试使用 GSON,但是一旦它尝试 jsonize 城市对象,它就会崩溃,因为它已被延迟初始化。朋友收藏也是如此。

对于集合而言,这没什么大不了的,因为在我的 api 中,我会有另一个请求 url,您可以在其中获取给定用户 ID 的所有朋友,但在与单个对象的关系的情况下(如本例中的城市),我想返回根据延迟加载的定义确实设置的 City 的 id。

我如何告诉 GSON 只对 City 的 cityId 属性而不是整个对象进行 json 化?

清空其余集合是否是一个很好的解决方案,因此它们不会被转换为 JSON?有没有其他方法可以明确告诉 GSON 忽略这些属性?

【问题讨论】:

  • 如果问题是 GSON 无法处理休眠代理,您可以尝试解除对象 stackoverflow.com/questions/2216547/… 的代理。如果问题是 GSON 触发延迟加载异常,那么您需要在调用 GSON 之前保持休眠会话打开(例如,通常在 Spring 中,这意味着您仍需要处于事务块中)
  • 我们在使用 Adob​​e Flex 时也遇到了这个问题。我们当时的解决方案是根本不使用延迟加载,但这样会影响性能。您可能想尝试另一个 JSON 库,例如 Jackson,看看它是否可以更好地处理 Hibernate 代理?或者,GSON 是否提供任何类型的自定义序列化程序?
  • 我的问题不在于严格意义上的代理(我没有收到任何与代理相关的错误),而更多的是 Gson 序列化关联对象的方式,试图将它们的每个属性转换为 Json。我希望特定对象仅序列化 id,而其余对象则简单地忽略它们(后者我知道该怎么做)
  • 然后我会看看自定义序列化:sites.google.com/site/gson/…

标签: json spring hibernate spring-mvc gson


【解决方案1】:

我相信您需要将您的 gson.toJson(...) 放入事务中,在 springMVC 中通常 @Transactional 在您正在执行实际序列化的控制器方法中。

如果你真的想跳过字段或选择性地序列化使用 Gson 的字段,你可以查看https://stackoverflow.com/a/3341439 了解 gson 排除策略。您可以根据 Field Annotation 或字段名称或整个引用的类跳过。

Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
    public boolean shouldSkipClass(Class<?> clazz) {
        return <class exclusion logic, return true for exclusion else false>;
    }
    public boolean shouldSkipField(FieldAttributes f) {
        return <field exclusion logic>;
    }
 }).create();

【讨论】:

  • 是的,这或多或少是我最终所做的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多