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

问题描述 投票:0回答:2

如今,我一直在制作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对象直接调用转发的控制器方法?

spring spring-mvc proxy controller forwarding
2个回答
0
投票

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


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

  }
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.