繁体   English   中英

在单个Spring应用程序上下文中具有不同凭据的相同Web服务端口类型?

[英]Same webservice port type with different credentials in a single Spring application context?

我有一个Web服务客户端,到目前为止具有固定的凭据。 现在,我需要相同的应用程序,但具有不同的凭据。 我希望只运行一个应用程序。 稍后将根据我的用户(例如ADMINUSER的状态选择两个可能的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM