Как программно пересылать запросы от контроллера к другому контроллеру в Spring MVC - PullRequest
0 голосов
/ 19 сентября 2018

В настоящее время я делаю систему API, и у меня возникла проблема с переадресацией запросов.

В моей системе API все запросы от пользователей сначала поступают на прокси-контроллеры, а затемзапросы перенаправляются в реальный версионный API.

// proxy controller
@Controller
@RequestMapping("/proxy")
public class ProxyController {
  private static final String VERSION = "v1";

  @RequestMapping(value = "/users", method = RequestMethod.GET)
  public String getUsers() {
     return String.format("forward:/%s/users", VERSION);
  }
}


// Real API controller
@RestController("v1UsersController")
@RequestMapping("/v1/users")
public class UsersController {

  @RequestMapping(value = "/users", method = RequestMethod.GET)
  public ApiResultsResponse<Users> findUsers(@RequestParam userId, ...) { 
    // ...
    // ...
    // ...
    // return users found
  } 

Я нашел прокси-контроллер, потому что я мог легко изменить реальный API, когда в некоторых случаях происходит, например, обновление версии API.

Однако, поскольку я использовал переадресацию со String (в данном случае return String.format("forward:/%s/users", VERSION)), я не уверен, существует ли перенаправленный реальный API или нет в настоящее время.

Итак, я 'Я хотел бы убедиться в этом, вызвав метод контроллера реального API напрямую.Если это так, когда вызываемый метод не существует, я могу заметить это с ошибками компиляции.Проблема в том, что мне нужно синхронизировать состояние параметров реального обработчика API с прокси. (Это довольно грязно.)

Можно ли напрямую вызывать метод переадресованного контроллера с использованием того же объекта HttpServletRequest?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Может быть, это решение поможет вам.

  @RequestMapping(value = "/users", method = RequestMethod.GET)
  public void getUsers(HttpServletRequest request,HttpServletResponse response) {

     String path = String.format("forward:/%s/users", VERSION);
     RequestDispatcher dispatcher=request.getRequestDispatcher(path);  
     dispatcher.forward(request, response); 

  }
0 голосов
/ 19 сентября 2018

Вы можете использовать Spring HandlerInterceptorAdapter для перехвата перед вызовом ваших контроллеров

...