spring boot 攔截返回值並進行包裝

Spring Boot 3.1.10

JAVA 17

---

 

序章

統一接口的返回值格式:ResultVO 對象。

攔截 Controller 的請求,對於 返回值不是 ResultVO 對象的,包裝成 ResultVO 對象,返回 null(void) 的除外。

 

實現方式

接口 ResponseBodyAdvice

+

註解 @ControllerAdvice

 

代碼:ResponseBodyProcess.java

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
@Slf4j
public class ResponseBodyProcess implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        if (Objects.isNull(body)) {
            return body;
        } else if (body instanceof ResultVO) {
            log.trace("todo del return body={}, uri={}", body, request.getURI());
        } else {
            log.debug("重新包裝返回值 body:class={}", body.getClass());
            return ResultVO.success(AppConstant.REQUEST_OK, body);
        }
        return body;
    }
}

 

進一步:配置 MessageConverters

接口 WebMvcConfigurer

方法 void configureMessageConverters(List<HttpMessageConverter<?>> converters)。

返回 String 時,會報 異常。

解釋見 參考文檔#2

 

默認的 converters:

converters=[
org.springframework.http.converter.ByteArrayHttpMessageConverter@141aba65, 
org.springframework.http.converter.StringHttpMessageConverter@b5312df, 
org.springframework.http.converter.StringHttpMessageConverter@3356ff58, 
org.springframework.http.converter.ResourceHttpMessageConverter@b55f5b7, 
org.springframework.http.converter.ResourceRegionHttpMessageConverter@2aa6bbad, 
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@6b2ef50e, 
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4300e240, 
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@6f867b0c
]

ben發佈於博客園

代碼:AppWebConfig.java

import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AppWebConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 配合 ResponseBodyProcess 使用:返回 String 時
        converters.add(0, new MappingJackson2HttpMessageConverter());
    }

}

ben發佈於博客園

測試接口

代碼:

TestController.java
 @RestController
@RequestMapping("api/test")
@Slf4j
public class TestController {

    @GetMapping("get/string")
    public String get() {
        log.info("getString");
        return "abc";
    }

    @GetMapping("get/void")
    public void getVoid() {
        log.info("getVoid");
    }

    @GetMapping("get/int")
    public int getInt() {
        log.info("getInt");
        return 1000;
    }

    @GetMapping("get/boolean")
    public boolean getBoolean() {
        log.info("getBoolean");
        return true;
    }

    @GetMapping("get/int/ex")
    public int getIntEx() {
        log.info("getInt");
        long ex = 123/0;
        return 1000;
    }

}

 

補充說明

1、對於 登錄、退出登錄 等 不是 Controller 中的接口,不能攔截。

2、除了 @ControllerAdvice 註解,還有一個 @RestControllerAdvice 註解。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
    // ...
}

3、interface ResponseBodyAdvice<T>

源碼說明:

Allows customizing the response after the execution of an @ResponseBody or a ResponseEntity controller method

but before the body is written with an HttpMessageConverter.

Implementations may be registered directly with RequestMappingHandlerAdapter and ExceptionHandlerExceptionResolver

or more likely annotated with @ControllerAdvice in which case they will be auto-detected by both.
Since: 4.1
Author: Rossen Stoyanchev

 

---END---

 

本文鏈接:

https://www.cnblogs.com/luo630/p/18147317

ben發佈於博客園

參考資料

1、spring boot 攔截器請求返回值 springboot攔截controller返回值
https://blog.51cto.com/u_14230/6286912

2、ResponseBodyAdvice、String返回值報cannot be cast to java.lang.String的解決辦法
勤而思
於 2021-06-30 18:33:07 發佈
https://blog.csdn.net/wen1652166675/article/details/118367098

3、

 

ben發佈於博客園

ben發佈於博客園

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章