在Spring Boot Web (Spring Web MVC)修改API回應內容,也就是response body的作法如下。
建立一個類別實作ResponseBodyAdvice
搭配@ControllerAdvice
即可修改Controller的回傳內容。
例如下面DemoController.hello()
的回傳字串為小寫字。
DemoController
package com.abc.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping(value = "/hello")
public String hello() {
return "hello world"; // 回傳為小寫字串
}
}
建立DemoResponseBodyAdvice
類別實作ResponseBodyAdvice
並在類別名稱前掛上@ControllerAdvice
。在覆寫方法supports()
決定是否要攔截回傳的結果;beforeBodyWrite()
中可修改response body的內容,例如把回應內容的小寫字串轉為大寫。
DemoResponseBodyAdvice
package com.abc.demo.controller.advice;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@ControllerAdvice
public class DemoResponseBodyAdvice implements ResponseBodyAdvice<String> {
@Override
public boolean supports(
MethodParameter methodParameter,
Class<? extends HttpMessageConverter<?>> aClass) {
return methodParameter.getParameterType()
.isAssignableFrom(String.class); // 回傳資料型態為String才攔截
}
@Override
public String beforeBodyWrite(
String body,
MethodParameter methodParameter,
MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
// body為API的回傳物件,型態決定於ResponseBodyAdvice<T>的T
return body.toUpperCase(); // 轉換字串為大寫
}
}
啟動專案呼叫/hello
的回應結果如下。
HELLO WORLD
沒有留言:
張貼留言