Java 使用Netbeans 7和Axis2从属性文件为客户端配置webservice URL

Java 使用Netbeans 7和Axis2从属性文件为客户端配置webservice URL,java,web-services,tomcat,netbeans,axis2,Java,Web Services,Tomcat,Netbeans,Axis2,我不熟悉Web服务开发。我将Netbeans 7.0与Axis2插件和Tomcat7一起使用 我为服务器组件创建了一个项目,在其中定义了web方法,然后为客户端组件创建了另一个项目。客户机是在Netbeans中通过选择New->Webservice client创建的 当您在Netbeans中选择New->Webservice Client时,它会立即询问您一个WSDL URL。当然,我从本地Tomcat安装中为它提供了WSDL URL。但是当我把它作为一个真正的应用程序发布时呢?用户不会将他们

我不熟悉Web服务开发。我将Netbeans 7.0与Axis2插件和Tomcat7一起使用

我为服务器组件创建了一个项目,在其中定义了web方法,然后为客户端组件创建了另一个项目。客户机是在Netbeans中通过选择New->Webservice client创建的

当您在Netbeans中选择New->Webservice Client时,它会立即询问您一个WSDL URL。当然,我从本地Tomcat安装中为它提供了WSDL URL。但是当我把它作为一个真正的应用程序发布时呢?用户不会将他们的客户端指向?wsdl。我的意思是,当从IDE运行客户机时,一切正常,但当我分发此应用程序时(这是一个人工管理应用程序,您在一个或多个客户机上打卡,并且时间卡被写入中央数据库),每个客户机都需要能够指向它应该连接到的任何生产服务器的webservice URL

我想将webservice URL存储在一个属性文件中,但不知道如何在客户端以编程方式调用从属性文件加载的URL

在客户机的dist文件夹中,如果打开netbeans用WinZip创建的JAR,我会看到一个文件名jax-ws-catalog.xml,其中包含URL(指向localhost)。我假设这就是运行时使用的URL的来源

那么正确的方法是什么呢?我到处搜索过,但我在谷歌搜索中发现的东西往往显示Web服务调用的方式与Netbeans自动生成的代码完全不同,我想了解一些关于Netbeans如何创建webservice客户端的特定信息,这样我就不会为了让IDE覆盖而进行更改

谢谢!对不起,解释得太长了


-Jim

这一点以前已经得到了回答:


NetBeans使用普通JAX-WS生成客户机代码,因此上面的答案应该适合您。您只需要添加一些代码,就可以从属性文件中获取端点URL。

我实际上是用另一种方式解决的,这可能是特定于Netbeans的工作方式。Shott85提供的答案也是一个很好的答案,但我认为这更具体于Netbeans自动生成代码的方式

因此,我有一个项目,其中所有web方法都驻留在SimplyLaborServer中,还有一个项目包含名为SimplyLaborClient的webservice客户端

在Netbeans中,在“Generated Sources(jax ws)”节点中的SimpleLaborClient项目下,它们有一个SimpleLaborServer.java文件,该文件有一个扩展服务的类。它有一个私有URL,硬编码到我的本地服务器的URL,如下所示

url = new URL("http://localhost:8080/axis2/services/SimplyLaborServer?wsdl");
在默认构造函数中,它使用这个URL。但它也提供了一个构造函数,如下所示,我可以在其中指定URL

public SimplyLaborServer(URL wsdlLocation) {
    super(wsdlLocation, SIMPLYLABORSERVER_QNAME);
}
所以当我有一个自动生成的方法,在我的客户端中看起来像这样

private static String testConnection() {
    simplylaborclient.SimplyLaborServer service = new simplylaborclient.SimplyLaborServer();
    simplylaborclient.SimplyLaborServerPortType port = service.getSimplyLaborServerHttpSoap12Endpoint();
    return port.testConnection();
}
我可以简单地加载一个具有端点URL的Properties对象,并将一行更改为下面的内容,其中props是一个具有使用正确URL定义的端点URL的Properties对象

simplylaborclient.SimplyLaborServer service = new simplylaborclient.SimplyLaborServer(new URL(props.getProperty("endpointUrl")));
我唯一关心的是,当您从“Web服务引用”节点拖放这些方法时,它们是自动生成的。如果我在服务器端进行其他更改,我不希望它们被覆盖

因此,我仍然愿意接受反馈,看这是否是正确的做法

谢谢

您正在使用本地(
http://localhost:8080/axis2/services
)仅用于创建web服务所需类的WSDL

开发完成后,您可以在web或本地网络中的任何位置托管web服务应用程序

完成web服务的开发后,您可以在本地部署它,并使用该服务创建客户端所需的类。创建客户机时,只需创建一个URL对象并传递web服务URL(托管URL),如下所示

PropertyResourceBundle resoureceBundle = (PropertyResourceBundle) PropertyResourceBundle.getBundle(‘Property file name and path’);
URL serviceURL = resoureceBundle. getString("Hosted_URL_Name");
ServiceClass service = new ServiceClass(serviceURL);
ServicePort servicePort = new ServicePort(service);
servicePort.getItems();
当您自动创建web服务客户端时,Netbeans IDE将创建许多类

在上面的示例代码中,ServiceClass是您最初使用本地URL创建的web服务主类。名称和构造函数参数将随web服务的不同而变化,但必须以字符串形式传递web服务URL(新托管的URL)


然后,使用服务类,您可以创建端口对象并访问所需的所有可用web方法。

因此,在我的客户端应用程序中,当我添加web方法时(即,在web service References节点下,我选择httpSOAP12endpoint并列出我的所有web方法;我选择一个并将其拖到客户端源文件上),我得到了下面这样的东西。。。私有静态字符串testConnection(){simplylaborclient.SimplyLaborServer服务=新建simplylaborclient.SimplyLaborServer();simplylaborclient.SimplyLaborServerPortType端口=服务。getSimplyLaborServerHttpSoap12Endpoint();返回端口。testConnection();}很抱歉,我的评论被打断。所以一个简单的testConnection方法在客户端看起来是这样的。。。私有静态字符串testConnection(){simplylaborclient.SimplyLaborServer服务=新simplylaborclient.SimplyLaborServer();simplylaborclient.SimplyLaborServerPortType端口=服务。getSimplyLaborServerHttpSoap12Endpoint();返回端口。testConnection();}在使用本地服务器运行时,这一点很好。因此,我创建了一个BindingProvider并将其设置为我的端口对象,然后使用从属性文件加载的enpointUrl执行类似的操作bp.getRequestContext().put(BindingProvider.ENDPOINT\u ADDRESS\u属性,endpointURL);然后我会执行bp.testConnection()吗?天哪,你不能很好地回复评论,真是糟糕透了;没有换行符,因此我无法在没有