簡體   English   中英

如何用Java創建一個stubless Web服務客戶端?

[英]How to make a stubless Web Service Client in Java?

我們目前在我們的企業中使用Axis2。 我們的項目涉及調用多個Web服務進行故障診斷。 問題是我們經常對WSDL進行更改(這些更改是非生命危險的,因為新的數據類型和服務只是被添加,很少會被刪除),因此我們也必須升級我們的應用程序。 基本上,我們有一個獲取WSDL的新副本,通過WSDL2java運行它並使用新的jar,運行我們的單元測試並打包新的jar並在生產中安裝。

雖然在編譯團隊中生成存根的能力為我們提供了可以在我們的Java DAO層代碼中輕松工作的xmlbeans,但由於WSDL而導致的編譯部署周期消耗了團隊的時間。 我想知道是否有可能改變? 是否有任何Java API可以在運行時生成存根或提供無存根的Web服務調用,但仍然能夠使用java對象而不是手工處理請求文檔? 這個肥皂測試網​​站的東西。 我應該能夠指定一個WSDL位置,我應該只獲取一個可以訪問該文檔的對象(請求和響應),還能夠在運行時更改WSDL位置?

不確定在Java中是否可以使用這種類型的運行時行為,因為在運行時生成的對象會有不同的類型等? 不確定...我已經看到一些Groovy示例接近我想要的但是使用Groovy意味着我們的體系結構改變......這有點難度......有沒有可用的Java庫/ API?

Eclipse Web Service Explorer動態構建任意WSDL的UI客戶端。 所以,如果您已准備好讓您的應用程序使用一些反射來調用服務,那么我想您可以做的事情是可能的。

由於Eclipse是開源的,您可以研究如何實現資源管理器並使用創意?

另一方面,你可以使用ant自動化你的構建,這樣如果一個新的WSDL到達它只是自動處理,良性的變化將被默默地吸收。 我的箴言是這是一種更好的方法。

不完全是stubless,而是更獨立的Spring的JaxWsPortProxyFactoryBean 您使用代碼實際使用的方法提供服務接口。 您可以提供用於連接到使用屬性的URL。 如果服務的位置發生更改,或者添加了更多方法(您的代碼尚未使用),則無需重新生成,編譯或打包。

如果您想要更新代碼以使用新操作的WSDL的新版本,請像現在一樣重新運行wsdl2java以獲得新的bean和新的服務接口。 因此,只有在更改代碼時才需要使用新功能。

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;
    }
}

未充分利用的Service類可能會提供您正在尋找的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM