2010-01-25 95 views
5

我試圖直接從@Webservice類生成WS客戶端jar。直接從源創建Web服務客戶端

讓我們這個例子:

package com.example.maven.jaxws.helloservice; 
    import javax.jws.WebService; 
    @WebService 
    public class Hello { 
    public String sayHello(String param) { 
    ; return "Hello " + param; 
    } 
    } 

我可以生成一個war文件,並使用GlassFish的服務於這個Web服務,並從那裏我可以使用GlassFish的WSDL URL生成客戶端源。

我想要做的是跳過glassfish部分。 從我定義web服務的maven項目中,我想使用jaxws-maven-plugin來創建客戶端類,但是我找不到任何指定webservice的實際URL的方法。

應該可以吧?

@see也Creating a web-service client with a known but inaccessible wsdl

回答

3

您應該使用<wsdlLocation>選項來指定WSDL文件在部署後可用的位置。

使用-wsdlLocation開關

還有一種簡單的方法來做到這一點 - 只是運行的wsimport與-wsdlLocation 開關,並提供WSDL位置 值,它是相對於 生成的服務類並且您需要 將此WSDL文件放在此相對位置 的位置。

See the post for more details

+0

所以你說你應該從以前的運行中下載一份WSDL的副本。對於Metro來說,這可能很難,因爲它包含額外的查找。 – 2012-08-16 13:25:19

5

創建Web服務客戶端應用程序總是與現有的WSDL文件開始(不像開發一個Web服務提供者),而且即使這不是唯一的方法,我建議使用wsimport工具(其他選項見5 Techniques for Creating Java Web Services from WSDL,但我不會介紹)。

所以,在您的客戶端項目,下面的代碼片段添加到您的pom.xml

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>jaxws-maven-plugin</artifactId> 
     <executions> 
     <execution> 
      <goals> 
      <goal>wsimport</goal> 
      </goals> 
      <configuration> 
      <wsdlUrls> 
       <wsdlUrl> 
       http://localhost:8080/helloservice/HelloService?wsdl 
       </wsdlUrl> 
      </wsdlUrls> 
      <packageName>com.example.maven.jaxws.helloclient</packageName> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
<bulid> 

jaxws-maven-plugin:wsimport魔力默認綁定到generate-sources生命週期階段,因此運行的任何階段後,以generate-sources將觸發jaxws:wsimport目標。

請注意,這是一個非常小的配置。如果你想要更多的細節/控制,請查看wsimport mojo的文檔。

例如,使用文件而不是網址爲WSDL(併產生更符合Maven的最佳實踐的位置Java代碼),用途:

<configuration> 
    <sourceDestDir>${project.build.directory}/generated-sources/wsimport</sourceDestDir> 
    <wsdlDirectory>${basedir}/src/wsdl</wsdlDirectory> 
    <wsdlFiles> 
    <wsdlFile>foo.wsdl</wsdlFile> 
    <wsdlFile>bar.wsdl</wsdlFile> 
    </wsdlFiles> 
    ... 
</configuration> 

更新:要調用一個預 - 型存根(使用來自WSDL的端點地址),代碼:

Hello port = new HelloService().getHelloPort(); 
String result = port.sayHello("Duke!"); 

爲了調用的端點爲地址爲從在WSDL中指定的一個不同的,定義新的端點URL和的QName :

URL endpoint_new = new URL("NEW_ADDRESS_HERE"); 
QName qname = new QName("http://"+"ORIGINAL_PACKAGE", "SERVICENAME"); 
Hello port = new HelloService(endpoint_new, qname).getHelloPort(); 

其中ORIGINAL_PACKAGE是這裏的服務發佈在包裝,SERVICENAME是我們所需要的服務,例如,HelloService的名稱。

+0

如果我使用最後一個解決方案(從wsdl文件生成客戶端),那麼客戶端jar將不包含webservice的URL。有沒有辦法給它提供maven?我只看到標籤,但沒有別的... – ben 2010-01-25 19:40:43

+0

這非常有幫助;謝謝一堆! – 2012-03-19 11:45:35

+1

在Metro中使用'@ WebService'時,WSDL是在運行時生成的,因此在編譯時可能不可用。 – 2012-08-16 13:22:42