Spring Controller: обработка пользовательских типов возврата - PullRequest
0 голосов
/ 01 апреля 2020

Я бы хотел, чтобы мои Spring Controllers возвращали Either<Redirect, X>, который затем можно развернуть, используя Filter / AOP, чтобы избежать повторения "это код перенаправления или ответ 2xx".

  • Если тип возвращаемого значения Either.Left(Redirect("host", "port")), то мой Фильтр / AOP вернет 302.

  • Если тип возвращаемого значения Either.Right(Vehicle(...)), то мой Фильтр / AOP вернет 200 и сериализует полезную нагрузку в JSON.

например

@GetMapping("vehicles/{id}")
public Either<Redirect, Vehicle> getById(@PathVariable("id") String id) {
    return someService.get(id);
}

Возможно ли это сделать с помощью Spring? Или я должен обработать это перенаправление на моем уровне контроллера, например

@GetMapping("vehicles/{id}")
public ResponseEntity getById(@PathVariable("id") String id) {
    return someService.get(id)
                      .fold(
                          redirect -> ResponseEntity.status(302).location(...).build(),
                          payload -> ResponseEntity.ok(payload).build()
                      );
}

Немного дополнительного контекста, если это полезно:

Это приложение является членом кластера и имеет "местное государство". Общее состояние распределено по кластеру. В результате, когда приходит запрос на конкретный идентификатор / ключ, он может попасть в неправильный экземпляр приложения, и его нужно будет перенаправить на правильный экземпляр.

...