这才是Controller层返回数据最优雅的写法
关于Controller的优雅写法,很多都是定一个统一返回对象ResponseResult,然后在定一个返回工具类ResultApi,于是Controller就成了这样:
@GetMapping("/{id}")
public ResponseResult<UserVO> getUserById(@RequestBody @PathVariable Long id) {
UserVO vo = usesrService.getById(id);
return ResultApi.ok(vo);
}
但是这样虽然很好,不过还得每个返回都用ResultApi.ok(),返回参数都得加ResponseResult<>,相对还是还是繁琐,有没有更简单的呢,在Controller,无需考虑别的,就按实际业务返回就行,比如
@GetMapping("/{id}")
public UserVO getUserById(@PathVariable Long id) {
UserVO vo = usesrService.getById(id);
return vo;
}
@PostMapping
public void getUserById(@RequestBody UserVO vo) {
usesrService.save(vo);
}
我们需要UserVO 就直接返回他就行了,如果无需返回就void,岂不是更好,要想实现这样的返回,只需要定一个统一返回拦截器就行
/**
* 实现ResponseBodyAdvice接口
*/
@ControllerAdvice
public class ResponseResultAdvice implements ResponseBodyAdvice<Object> {
/**
* 可以指定哪些情况走统一返回,哪些不走
*/
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
//判断是否走beforeBodyWrite
return true;
}
/**
* 定义统一返回数据
*/
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof ResponseResult){
return body;
}
return ResponseResult.ok(body);
}