動態jsonView
在從後臺資料獲取時,發現並沒有自己想要的欄位,原因是後臺使用jsonView並沒有包含自己想要的欄位.
動態jsonView
一開始想重新寫一個方法,使用新定義的jsonView,但是功能都一樣,感覺沒有必要.因為就是需要使用不同的jsonView,所以考慮能不能根據情況使用不同的jsonView返回資料.
解決
在stackoverflow上找到了解決方法,對此他有一段描述:
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資料。