我有一个使用JavaScript MVC框架(Ember.js),Spring-MVC控制器层和Spring / JPA业务层的Web应用程序。我的问题是 关于在Spring控制器中将Java输出序列化为JSON。
控制器类如下所示:
@RequestMapping("countries")
@ResponseBody
public Collection<Country> getAll() {
return countryService.getAllCountries();
}
@RequestMapping("country/{id}")
@ResponseBody
public Country getById(@PathVariable Long id) {
return countryService.getCountry(id);
}
JPA实体是:
@Entity
class Country {
@OneToMany
Collection<State> states;
//...
}
@Entity
class State {
// ...
}
方法getAll用于显示每个国家/地区的信息(名称,大小,人口)有限的屏幕。方法getById用于显示一个国家及其完整数据集的屏幕;这包括其国家子实体的收集。
JSON序列化的最佳建议解决方案是将Jackson添加到类路径中,让Spring-MVC完成所有的魔术。然而,让杰克逊盲目地序列化每个属性太过粗糙。但是使用@JsonProperty或@JsonIgnore等杰克逊注释来注释我的JPA字段并不具吸引力。首先,它在技术上将我的业务层与界面问题联系起来。其次,它会危及维护:JPA属性名称的任何更改都必须传播到JavaScript代码 - 没有编译器的帮助。第三,更重要的是,实体的属性是否必须序列化在实体层面上不是确定性的:在“getAll”案例中,国家必须 不是序列化的,而在“getById”中它们必须是。
我可以依靠杰克逊忽视懒惰的JPA关系吗?例如,在“getAll”操作中,杰克逊会忽略每个国家的“州”属性吗?
或者我应该手动实现Java-to-JSON序列化?