这才是Controller层返回数据最优雅的写法

2024-11-11
spring boot
Controller
response

关于 Controller 的优雅写法,很多都是定一个统一返回对象 ResponseResult,然后在定一个返回工具类 ResultApi,于是 Controller 就成了这样:

1@GetMapping("/{id}")
2public ResponseResult<UserVO> getUserById(@RequestBody @PathVariable Long id) {
3    UserVO vo = usesrService.getById(id);
4    return ResultApi.ok(vo);
5}

但是这样虽然很好,不过还得每个返回都用 ResultApi.ok(),返回参数都得加 ResponseResult<>,相对还是还是繁琐,有没有更简单的呢,在 Controller,无需考虑别的,就按实际业务返回就行,比如

 1@GetMapping("/{id}")
 2public UserVO getUserById(@PathVariable Long id) {
 3    UserVO vo = usesrService.getById(id);
 4    return vo;
 5}
 6
 7@PostMapping
 8public void getUserById(@RequestBody UserVO vo) {
 9    usesrService.save(vo);
10}

我们需要 UserVO 就直接返回他就行了,如果无需返回就 void,岂不是更好,要想实现这样的返回,只需要定一个统一返回拦截器就行

 1/**
 2 * 实现ResponseBodyAdvice接口
 3 */
 4@ControllerAdvice
 5public class ResponseResultAdvice implements ResponseBodyAdvice<Object> {
 6
 7/**
 8 * 可以指定哪些情况走统一返回,哪些不走
 9 */
10@Override
11public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
12    //判断是否走beforeBodyWrite
13    return true;
14}
15/**
16 * 定义统一返回数据
17 */
18@Override
19public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
20    if (body instanceof ResponseResult){
21        return body;
22    }
23    return ResponseResult.ok(body);
24}
关注 “AUTRE” 微信公众号,给我留言
Placeholder Image