Как получить доступ к POJO, возвращенному методом RestController (конечная точка) в Spring Boot? - PullRequest
0 голосов
/ 11 января 2019

Я хочу иметь возможность изменить POJO, возвращенный методом RestController (или конечной точкой), до его сериализации в HttpServletResponse в виде потока данных. Но я хочу иметь возможность делать это вне кода метода контроллера (в качестве промежуточного программного обеспечения).

Я пытался сделать это с помощью HandlerInterceptor, но у меня нет доступа к POJO. Я также пытался использовать AOP, но Pointcut никогда не вызывался.

@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;
  }
}

Я хочу иметь возможность добавить список errors (при необходимости) в Ресурс, возвращаемый Контроллером после того, как контроллер выполняет свою собственную логику и возвращает.

1 Ответ

0 голосов
/ 12 января 2019

Чтобы изменить объект после возврата из метода @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;
    }
}
...