AdSense

網頁

2020/7/31

Spring Boot 使用ResponseBodyAdvice修改Response

在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

沒有留言:

AdSense