【发布时间】: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 中,这意味着您仍需要处于事务块中)
-
我们在使用 Adobe Flex 时也遇到了这个问题。我们当时的解决方案是根本不使用延迟加载,但这样会影响性能。您可能想尝试另一个 JSON 库,例如 Jackson,看看它是否可以更好地处理 Hibernate 代理?或者,GSON 是否提供任何类型的自定义序列化程序?
-
我的问题不在于严格意义上的代理(我没有收到任何与代理相关的错误),而更多的是 Gson 序列化关联对象的方式,试图将它们的每个属性转换为 Json。我希望特定对象仅序列化 id,而其余对象则简单地忽略它们(后者我知道该怎么做)
-
然后我会看看自定义序列化:sites.google.com/site/gson/…
标签: json spring hibernate spring-mvc gson