我的控制器:
@RestController
@RequestMapping("/mypath")
public class MyController {
@Autowired
MyServiceInterface service;
@PostMapping("/{source}")
void myControllerFunc(@PathVariable String source, @RequestBody MyObject obj) {
...
Object myServiceObj = service.myServiceFunc(param);
...
}
}
我的服务界面:
public interface MyServiceInterface {
Object myServiceFunc(String param);
}
我的服务障碍:
@Service
public class MyServiceOne {
Object myServiceFunc(String param) {
...
}
}
@Service
public class MyServiceTwo {
void myServiceFunc(String param) {
...
}
}
我的春季启动版本:1.5.7
我想根据我的path变量(“ source”)注入服务。如果source = 1,则注入MyServiceOne;如果source = 2,则注入MyServiceTwo。
这可能吗?
答案 0 :(得分:2)
听起来您需要同时使用这两个功能,并且控制器上的每个方法调用都可以选择一个不同的方法。因此,用限定符区分这两种实现。在controller方法中使用path变量,并使其以编程方式决定要调用的服务。
答案 1 :(得分:1)
我认为这是不可能和合理的。
@RestController
本质上是一个单例。它在启动时进行配置,并且对于每个请求都保持不变。
表达式/{source}
在运行时的请求过程中已被设置控制器时正在求值。
要考虑的选项:
答案 2 :(得分:0)
如Get bean from ApplicationContext by qualifier中所述,您可以在每个服务实现中添加限定符,并在myControllerFunc
中具有以下内容:
BeanFactoryAnnotationUtils.qualifiedBeanOfType(ctx.getBeanFactory(), MyServiceInterface.class, source)