如何在Java中创建无存根Web服务客户端?

如何在Java中创建无存根Web服务客户端?,java,service,Java,Service,我们目前正在企业中使用Axis2。我们的项目涉及调用多个Web服务进行故障诊断。问题是,我们经常会对WSDL进行更改(这些更改不会威胁生命,因为新的数据类型和服务刚刚添加,很少会删除),因此我们也必须升级应用程序。基本上,我们需要一个新的WSDL副本,通过WSDL2java运行它并使用新的JAR,运行我们的单元测试并打包新的JAR并在生产中安装 尽管编译团队生成存根的能力为我们提供了xmlbeans,我们可以轻松地在java DAO层代码中使用xmlbeans,但是由于WSDL而导致的编译部署周

我们目前正在企业中使用Axis2。我们的项目涉及调用多个Web服务进行故障诊断。问题是,我们经常会对WSDL进行更改(这些更改不会威胁生命,因为新的数据类型和服务刚刚添加,很少会删除),因此我们也必须升级应用程序。基本上,我们需要一个新的WSDL副本,通过WSDL2java运行它并使用新的JAR,运行我们的单元测试并打包新的JAR并在生产中安装

尽管编译团队生成存根的能力为我们提供了xmlbeans,我们可以轻松地在java DAO层代码中使用xmlbeans,但是由于WSDL而导致的编译部署周期会占用团队的时间。我想知道是否有可能的变化?是否有任何Java API可以在运行时生成存根或提供无存根的web服务调用,但仍然让我们能够使用Java对象而不是手工制作请求文档?差不多。我应该只能够指定一个WSDL位置,并且应该只获取一个对象,通过它我可以访问文档(请求和响应),还可以在运行时更改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(远程); 返回代理; } }
文档不足的服务类可能会提供您需要的服务