![](https://csdnimg.cn/release/download_crawler_static/76860082/bg1.jpg)
1
Spring Boot
中
Controller
间的调用
2022/1/20
问题
假定两个
Controller
都在同一个工程中。
如果有比较合理的分层设计,这样的需求应该是非常罕见的。因为大部分情况下,调用
应该都是限于对业务逻辑层或者数据库层,并不会涉及
Controller
之间的调用。
本文是讨论
Controller A
必须调用
Controller B
的情况。
Controller A
可以返回
redirect
和
forward
指令来进行跳转到
Controller A
,但这不属于本
文讨论的场景。
显然不应该通过直接创建
Controller B
的实例,再调用方法来完成。因为
Controller B
的
实例中,
Spring Boot
为其进行配置和对象注入,这些准备工作不是简单通过实例化
Controller B
可以完成。
RestTemplate
远程调用
比较容易想到的方法是使用
RestTemplate
进行一次远程调用。实例代码如下:
@RestController
@RequestMapping({"/flop"})
@Validated
public class FlopController {
@Value("${server.port}")
private String serverPort;
@RequestMapping({"/method"})
public String restForward() {
String uri = "http://localhost:" + serverPort + "/doc/test";
RestTemplate rest = new RestTemplate();
String result = rest.getForObject(uri, String.class);
return result;
}
}
这是一次完整的
HTTP
远程调用。这样做的缺点显而易见。
首先是上下文问题,如果被调用的接口有上下文限制那么在调用时必须进行准备,
这不但有开发上的成本,同时也有维护问题,以及安全限制。
其次是准备调用路径时,需要关注部署方式,包括了解是
http
还是
https
,以及绑
定地址和端口限制,需要应对配置环境的变动。
第三是性能问题。