![](/img/trans.png)
[英]Holding two different versions of the same spring bean in the same application context
[英]Same webservice port type with different credentials in a single Spring application context?
我有一个Web服务客户端,到目前为止具有固定的凭据。 现在,我需要相同的应用程序,但具有不同的凭据。 我希望只运行一个应用程序。 稍后将根据我的用户(例如ADMIN
或USER
的状态选择两个可能的Web服务凭据之一。
基于该状态,我想委托一个或另一个凭据。
问题:我正在使用Spring
注入创建Web服务端口,并且希望继续这种方法。 无论如何,当我现在需要第二个凭据时,可能必须为Web服务客户端创建第二个端口。
但是:我当然不能创建两个相同类型的bean。
@Configuration
public class AppConfig {
@Bean
public WsPort getPort() {
WsPort port = new MyWebService().getWsPort(); //these are auto generated classes from a wsdl
addCredentials(port, username1, pass1); //sets the HTTP header credentials
return port;
}
//this won't work as WsPort bean must be unique
@Bean
public WsPort getPort2() {
WsPort port = new MyWebService().getWsPort();
addCredentials(port, username2, pass2);
return port;
}
}
到目前为止,我正在使用该端口:
@Service
public class MyClient {
@Autowired
private WsPort port;
}
当然,我不能再这样使用它了,因为我必须根据用户状态选择端口。
我怎么能拥有两个相同类型但具有不同“内容”(http凭据)的对象(在我的情况下为webservice端口)?
您必须给他们使用不同的名称:
@Bean(name = "port1")
public WsPort getPort() {
WsPort port = new MyWebService().getWsPort();
addCredentials(port, username1, pass1);
return port;
}
@Bean(name = "port2")
public WsPort getPort2() {
WsPort port = new MyWebService().getWsPort();
addCredentials(port, username2, pass2);
return port;
}
并在客户中使用限定词:
@Service
public class MyClient {
@Autowired
@Qualifier("port1")
private WsPort port;
}
或者从上下文中获取实例
@Service
public class MyClient {
@Autowired
private ApplicationContext context;
...
public void myMethod(){
context.getBean("port1", WsPort.class).doWhatever();
}
}
编辑:您也可能只有一个端口作为prototype
bean来每次获取一个新实例,并相应地从客户端设置登录详细信息
@Bean
@Scope("prototype")
public WsPort getPort() {
return new MyWebService().getWsPort();
}
@Service
public class MyClient {
@Autowired
private WsPort port;
...
public void myMethod(){
addCredentials(port, username2, pass2);
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.