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. |
---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發佈於博客園