如何在Java中创建无存根Web服务客户端?
我们目前正在企业中使用Axis2。我们的项目涉及调用多个Web服务进行故障诊断。问题是,我们经常会对WSDL进行更改(这些更改不会威胁生命,因为新的数据类型和服务刚刚添加,很少会删除),因此我们也必须升级应用程序。基本上,我们需要一个新的WSDL副本,通过WSDL2java运行它并使用新的JAR,运行我们的单元测试并打包新的JAR并在生产中安装 尽管编译团队生成存根的能力为我们提供了xmlbeans,我们可以轻松地在java DAO层代码中使用xmlbeans,但是由于WSDL而导致的编译部署周期会占用团队的时间。我想知道是否有可能的变化?是否有任何Java API可以在运行时生成存根或提供无存根的web服务调用,但仍然让我们能够使用Java对象而不是手工制作请求文档?差不多。我应该只能够指定一个WSDL位置,并且应该只获取一个对象,通过它我可以访问文档(请求和响应),还可以在运行时更改WSDL位置如何在Java中创建无存根Web服务客户端?,java,service,Java,Service,我们目前正在企业中使用Axis2。我们的项目涉及调用多个Web服务进行故障诊断。问题是,我们经常会对WSDL进行更改(这些更改不会威胁生命,因为新的数据类型和服务刚刚添加,很少会删除),因此我们也必须升级应用程序。基本上,我们需要一个新的WSDL副本,通过WSDL2java运行它并使用新的JAR,运行我们的单元测试并打包新的JAR并在生产中安装 尽管编译团队生成存根的能力为我们提供了xmlbeans,我们可以轻松地在java DAO层代码中使用xmlbeans,但是由于WSDL而导致的编译部署周
不确定这种类型的运行时行为在Java中是否可行,因为在运行时生成的对象将具有不同的类型等等??不确定。。。我看到一些Groovy示例接近我想要的,但是使用Groovy对我们来说意味着架构的改变。。这有点难。。。是否有可用的Java库/API?Eclipse Web Service Explorer动态构建任意WSDL的UI客户端。所以我想,如果你准备好让你的应用程序使用一些反射来调用服务,那么你想做的是可能的 由于Eclipse是开源的,您可以研究explorer是如何实现和使用IDEA的
另一方面,您是否可以使用ant自动化您的构建,这样,如果新WSDL到达,它就会被自动处理,良性的更改就会被默默地吸收。我的建议是这是一个更好的方法。不是完全没有存根,而是更独立的Spring方法。为服务接口提供代码实际使用的方法。您可以使用属性提供要连接到的URL。 如果服务的位置发生更改,或者添加了更多方法(您的代码尚未使用),则不需要重新生成、编译或打包 如果您获得了一个新版本的WSDL,并且希望更改代码以使用新操作,只需像今天一样重新运行wsdl2java,以获得新的bean和新的服务接口。因此,您只需在更改代码时使用新功能即可完成这项工作。
import java.net.MalformedURLException;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
/**
* This class creates SOAP clients from WDSL and a Java interface.
* See http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXRPC5.html
* <p>
* Consider the following sample usage:
* <pre>
URL wsdl = new URL("http://localhost:8080/calc/calc?wsdl");
String serviceName = "CalculatorWSService";
String nameSpaceURI = "http://calculator.me.org/";
String portName = "CalculatorWSPort";
Calculator calc = SOAPClient.newInstance(wsdl, nameSpaceURI, serviceName, portName, Calculator.class);
* </pre>
* @author Curt
*/
public final class SOAPClient {
/**
* Create a new SOAPClient, given the specified parameters.
* @param url where the WSDL is
* @param nameSpaceUri
* @param serviceName
* @param portName
* @param face interface to use
* @return an object that implements the interface and is connected to the server
*/
public static <T> T newInstance(
URL url, String nameSpaceUri, String serviceName,
String portName, Class<T> face)
throws RemoteException
{
try {
QName portQname = new QName(nameSpaceUri, portName);
QName serviceQname = new QName(nameSpaceUri, serviceName);
Service service = Service.create(url, serviceQname);
T remote = service.getPort(portQname,face);
T proxy = face.cast(remote);
return proxy;
} catch (Throwable t) {
String message =
"Connecting to URL=" + url +
" name space URI= "+ nameSpaceUri +
" service name=" + serviceName +
" interface=" + face +
" port=" + portName;
throw new RemoteException(message,t);
}
}
/**
* Don't specify the portName and trust that the service will do it.
*/
public static <T> T newInstance(
URL url, String nameSpaceUri, String serviceName, Class<T> face)
throws MalformedURLException, RemoteException
{
QName serviceQname = new QName(nameSpaceUri, serviceName);
Service service = Service.create(url, serviceQname);
T remote = service.getPort(face);
T proxy = face.cast(remote);
return proxy;
}
}
导入java.net.URL;
导入java.rmi.RemoteException;
导入javax.xml.namespace.QName;
导入javax.xml.ws.Service;
/**
*此类从WDSL和Java接口创建SOAP客户端。
*看http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXRPC5.html
*
*考虑以下样品使用情况:
*
URL wsdl=新URL(“http://localhost:8080/calc/calc?wsdl");
字符串serviceName=“CalculatorWSService”;
字符串nameSpaceURI=”http://calculator.me.org/";
字符串portName=“CalculatorWSPort”;
Calculator calc=SOAPClient.newInstance(wsdl、nameSpaceURI、serviceName、portName、Calculator.class);
*
*@author Curt
*/
公共最终类SOAPClient{
/**
*给定指定的参数,创建一个新的SOAPClient。
*@param-url,WSDL所在的位置
*@param nameSpaceUri
*@param serviceName
*@param-portName
*@param要使用的面接口
*@返回实现接口并连接到服务器的对象
*/
公共静态T newInstance(
URL URL、字符串名称空间URI、字符串serviceName、,
字符串端口名,类面)
抛出远程异常
{
试一试{
QName portQname=新的QName(名称空间URI,端口名);
QName serviceQname=新的QName(nameSpaceUri,serviceName);
Service=Service.create(url,serviceQname);
T remote=service.getPort(portQname,face);
T proxy=face.cast(远程);
返回代理;
}捕获(可丢弃的t){
字符串消息=
“连接到URL=“+URL”+
“名称空间URI=”+名称空间URI+
“服务名称=”+服务名称+
“接口=”+面+
“port=“+portName;
抛出新的RemoteException(消息,t);
}
}
/**
*不要指定端口名并相信服务会这样做。
*/
公共静态T newInstance(
URL URL、字符串名称空间URI、字符串服务名称、类面)
引发畸形的DurLexException,RemoteException
{
QName serviceQname=新的QName(nameSpaceUri,serviceName);
Service=Service.create(url,serviceQname);
T remote=service.getPort(面);
T proxy=face.cast(远程);
返回代理;
}
}
文档不足的服务类可能会提供您需要的服务