如何访问 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;
}
}
我希望能够在 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;
}
}