我使用Spring MVC + Hibernate开发了这个webapp。
我检索服务中的所有对象,然后将它们直接返回给控制器。这些对象通常是懒惰地初始化,因此集合是空的。
因此对象用户:
User
{
int idUser;
City city;
String name;
List<User> friends;
}
我返回一个只有idUser和name的对象,City和Friends没有初始化。
我想利用我所有的服务方法(不修改它们)来提供REST API,所以如果从我的ApiController请求获取id为1的用户,我将在JSON中检索有关该用户的所有有用信息。 / p>
我尝试使用GSON,但是一旦它试图将城市对象jsonize它崩溃了,因为它已经被懒惰地初始化了。朋友收藏也一样。
对于集合而言,这并不是什么大不了的事,因为在我的api中我会有另一个请求url,你可以给所有朋友一个用户ID,但是在与一个对象的关系的情况下(如本例中的城市) ),我想返回城市的id,根据Lazy加载的定义确实设置了。
如何告诉GSON只将城市的cityId属性jsonize而不是整个对象?
将其余的集合归零是一个很好的解决方案,因此它们不会转换为JSON吗?有没有其他方法明确告诉GSON忽略这些属性?
答案 0 :(得分: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();