如何访问 Spring Boot 中 RestController 方法(端点)返回的 POJO?

How to have access to the POJO returned by a RestController method (endpoint) in Spring Boot?

我希望能够在 RestController 方法(或端点)作为数据流序列化到 HttpServletResponse 之前修改它返回的 POJO。但我希望能够在控制器方法代码之外进行(作为中间件)。

我曾尝试使用 HandlerInterceptor 来完成此操作,但我无权访问 POJO。我也尝试过使用 AOP,但从未调用切入点。

@RestController
public class TestController {
  @GetMapping("/test")
  public Resource<User> getTest() {
    Resource<User> resource = new Resource<>();
    resource.setData(new User("test user"));
    return resource;
  }


  @Builder
  @Getter
  @Setter
  @AllArgsConstructor
  static class User {
    private String username;
  }

  @Getter
  @Setter
  @AllArgsConstructor
  @NoArgsConstructor
  static class Resource<T> {
    private T data;
    private Set<String> errors;
  }
}

我希望能够在控制器执行自己的逻辑和 returns.

之后向控制器返回的资源添加 errors 的列表(如果需要)

要在从 @RestController 方法返回后但在写入 HTTP 响应之前更改对象,您可以实现 ResponseBodyAdvice 并将其声明为 @ControllerAdvice bean:

@ControllerAdvice
public static class Foo implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

        //body is the object return from the @RestController method
        //Cast it and modify it accordingly.
        if(body instanceof Resource) {
            Resource res = (Resource)body;
            //Modify it .... blablablba
        }
        return body;
    }
}