在从后台数据获取时,发现并没有自己想要的字段,原因是后台使用 jsonView 并没有包含自己想要的字段.
动态 jsonView
一开始想重新写一个方法,使用新定义的 jsonView, 但是功能都一样,感觉没有必要. 因为就是需要使用不同的 jsonView, 所以考虑能不能根据情况使用不同的 jsonView 返回数据.
解决
在 stackoverflow 上找到了解决方法, 对此他有一段描述:
On the off chance someone else wants to achieve the same thing, it actually is very simple.You can directly return aorg.springframework.http.converter.json.MappingJacksonValue instance >from your controller that contains both the object that you want to serialise and the view >class.
This will be picked up by the org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter#writeInternal method and the appropriate view will be used.
大意是说可以通过返回 MappingJacksonValue 这个类的实例来解决这个问题, 并且给出了实例代码:
@RequestMapping(value = “/accounts/{id}”, method = GET, produces = APPLICATION_JSON_VALUE)
public MappingJacksonValue getAccount(@PathVariable(“id”) String accountId, @AuthenticationPrincipal User user) {
final Account account = accountService.get(accountId);
final MappingJacksonValue result = new MappingJacksonValue(account);
final Class<? extends View> view = accountPermissionsService.getViewForUser(user);
result.setSerializationView(view);
return result;
}
首先就是创建 MappingJacksonValue 类实例,在构造函数中传入要序列化的对象, 之后调用 setSerializationView 方法传入 jsonView 的 class 对象就行了,AbstractJackson2HttpMessageConverter 类会处理这个对象并根据传入 jsonView 来序列化对象.
#最终
最终代码:
@GetMapping
@ResponseStatus(HttpStatus.OK)
private MappingJacksonValue getAll(@RequestParam(required = false, value = “isCascade”, defaultValue = “false”) boolean cascade) {
List<College> collegeList = collegeService.getAllCollege();
MappingJacksonValue result = new MappingJacksonValue(collegeList);
if (cascade) {
result.setSerializationView(CollegeJsonView.getCascadeMessage.class);
} else {
result.setSerializationView(CollegeJsonView.getAll.class);
}
return result;
}
根据 isCascade 参数来判断是否返回自定义的 josnView 数据。