如何从不同的服务器调用相同的wsdl

时间:2015-02-27 08:54:05

标签: java web-services soap wsdl

我有一个JSF网页。这个网页从后端调用.net Web服务。我想在不同的主机上使用这个Web服务(webservice只是主机-wsdllocation-不同),但我不想从主机回忆我的JSF项目的wsdl。现在,我正在导入wsdl这个命令行:

$ wsimport -keep -verbose "wsdl url"

并且这行有“wsdlurl”但是当我将我的web服务上传到不同的web服务器时,我必须在使用新的“wsdlurl”后回想起webservice,之后我必须编写新的代码。在.net这种方式非常容易,如果我想从不同的主机使用相同的wsdl我可以只添加一个wsdl位置行到webconfig.xml有没有任何方式在java中有关于此?如何在不编写代码的情况下从不同服务器调用相同的wsdl?

2 个答案:

答案 0 :(得分:0)

您可以在创建服务对象时设置URL

答案 1 :(得分:0)

默认情况下,当您在客户端中导入wsdl文件并尝试打开该服务的端口时,它会测试与导入的wsdl中引用的默认URL的连接。为了避免错误,我首先使用指向wsdl导入的phisical文件的URL创建服务对象。

    URL baseUrl = <classname>.class.getClassLoader().getResource("wsdl/Service.wsdl");
    ServiceExtended service = new ServiceExtended(baseUrl);

此外,我使用从原始ServiceStub类扩展的中间类,这是我用于覆盖未来连接的连接超时和请求超时属性的方式,还可以使用处理程序添加一些安全层等等。

public class ServiceExtended extends ServiceOriginal {
...
public ServiceExtended(URL wsdlLocation) {
    super(wsdlLocation);
}

public ProductRepository getPersonalizedPort(URL wsdlLocation, int connectTimeout, int requestTimeout) {
        ProductRepository port = super.getProductRepositoryPort();
        ((BindingProvider) port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, wsdlLocation.toString());
        //JAXS-WS for compatibility
        ((BindingProvider) port).getRequestContext().put("com.sun.xml.ws.connect.timeout", connectTimeout);
        ((BindingProvider) port).getRequestContext().put("com.sun.xml.ws.request.timeout", requestTimeout);
        //JAXS-WS new
        ((BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", connectTimeout);
        ((BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", requestTimeout);
        return port;
    }
...
}

这是一个例子,因为我在META-INF旁边的“src / main / resources / wsdl /”中使用maven保存.wsdl文件,随意将这些文件放在你想要的地方。使用这种方式,Service对象的创建不会失败,因为您指向真实路径,在这种情况下指向存在的文件。 之后,您无法创建指向所需URL的服务的端口。 例如: url1 = http://server1.com/appname/Service?wsdl url2 = http://server2.com/appname/Service?wsdl

ServicePort port = service.getPersonalizedPort(url1, 10000, 30000);
o
ServicePort port = service.getPersonalizedPort(url2, 10000, 30000);

这是一个如何连接到webservice的示例。

希望得到这个帮助。