如何在Spring MVC中以编程方式将请求从控制器转发到另一个控制器

时间:2018-09-19 02:02:22

标签: spring spring-mvc proxy controller forwarding

如今,我一直在开发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的controller方法来确保这一点。如果是这样,当被调用的方法不存在时,我会注意到这带有编译错误。问题是,我必须将真正的api处理程序的参数条件与代理进行同步。(这有点肮脏。)

是否可以使用相同的HttpServletRequest对象直接调用转发的控制器方法?

2 个答案:

答案 0 :(得分:0)

您可以在调用控制器之前使用spring HandlerInterceptorAdapter进行拦截

答案 1 :(得分:0)

也许此解决方案可以为您提供帮助。

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

  }