spring - 如何在 Spring MVC 中以编程方式将请求从控制器转发到另一个控制器
问题描述
如今,我一直在制作 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 HandlerInterceptorAdapter 进行拦截
推荐阅读
- javascript - 无法使用角度从资产文件夹中检索 json 数据
- php - 如果一个变量不为空,则将两个 PHP 变量合二为一
- javascript - react-ga:在执行“ReactGA.pageview”或“ReactGA.event”之前,每次都需要运行“ReactGA.initialize”
- android - WebRTC android-PeerConnectionFactory.createPeerConnection 总是返回 null
- node.js - 如何在电子更新器中下载期间在窗口中显示进度条
- android - 如何使用 GoogleMap 颤振在 2 个标记之间绘制路径 *不使用 MapView* 使用 GoogleMap 颤振
- build.gradle - 从 Teamcity 发布到 Artifactory 后 RPM 包名称更改
- spring - RuntimeException:必须提供 MemberAccess 实现
- c# - 如何并行化这个 C# 算法?
- c++ - 带有自定义分配器的 const T 的 STL 容器格式不正确吗?