Hibernate使用GSON将对象检索到Json

Hibernate使用GSON将对象检索到Json,json,spring,hibernate,spring-mvc,gson,Json,Spring,Hibernate,Spring Mvc,Gson,我使用SpringMVC+Hibernate开发了这个webapp 我检索服务中的所有对象,然后将它们直接返回给控制器。这些对象通常是延迟初始化的,因此集合是空的 因此,对于对象用户: User { int idUser; City city; String name; List<User> friends; } 用户 { int idUser; 城市; 字符串名; 列出朋友; } 我返回一个只有idUser和name的对象,City和Friends没有初

我使用SpringMVC+Hibernate开发了这个webapp

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

因此,对于对象用户:

User
{
   int idUser;
   City city;
   String name;
   List<User> friends;
}
用户
{
int idUser;
城市;
字符串名;
列出朋友;
}
我返回一个只有idUser和name的对象,City和Friends没有初始化

我希望利用我的所有服务方法(不修改它们)来提供RESTAPI,因此如果我从ApicController请求获取id为1的用户,我将以JSON检索有关该用户的所有有用信息

我尝试使用GSON,但当它尝试对city对象进行jsonize时,它就会崩溃,因为它已经被惰性地初始化了。朋友系列也是如此

对于集合来说,这没什么大不了的,因为在我的api中,我会有另一个请求url,在这个url中,你可以获得所有的朋友,给他们一个用户Id,但是对于与单个对象的关系(如本例中的城市),我想返回城市的Id,根据延迟加载的定义,这个Id确实是设置好的

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


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

我认为您需要将您的
GSON.toJson(…)
放在一个事务中,在springMVC中,通常
@Transactional
在控制器方法中执行实际的序列化即可

如果您确实想跳过字段或有选择地序列化使用Gson的字段,可以检查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();
Gson Gson=new GsonBuilder().setExclutionStrategies(new ExclutionStrategies()){
公共布尔shouldSkipClass(类clazz){
返回;
}
公共布尔值shouldSkipField(字段属性f){
返回;
}
}).create();

如果问题是GSON无法处理hibernate代理,您可以尝试解除对象的保护。如果问题是GSON触发延迟加载异常,那么您需要在调用GSON之前保持hibernate会话打开(例如,通常在Spring中,这意味着您需要仍然处于事务块中),我们在Adobe Flex中也遇到了这个问题。当时我们的解决方案是根本不使用延迟加载,但这样会影响性能。您可能想尝试另一个JSON库,比如Jackson,看看它是否可以更好地处理Hibernate代理?或者,GSON是否提供任何类型的自定义序列化程序?我的问题不在于严格的代理(我没有收到任何与代理相关的错误),而在于GSON序列化关联对象的方式,试图将它们的每个属性转换为Json。我想让特定的对象只序列化ID,而让其余的对象忽略它们(我知道后一种方法),然后我会看看自定义序列化:是的,这或多或少是我最终做的。谢谢