0

我使用 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 属性而不是整个对象进行 jsonize?

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

4

1 回答 1

0

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

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

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();
于 2013-12-16T02:03:12.577 回答