2010-08-25 20 views
44

使用通過wsimport生成的代碼,可以重寫服務端點而不必重新生成代碼?在運行時爲使用wsimport生成的代碼覆蓋或設置Web服務端點

我寫了一個簡單的java web服務,以下是具體步驟:

  1. 我編譯Java類,並生成一個WAR文件
  2. 將WAR文件部署到我的應用程序服務器(Tomcat)的
  3. 通過URL訪問WSDL,例如本地主機:8080 /服務/ HelloService的WSDL
  4. 使用URL與wsimport.bat產生例如客戶端類:wsimport http://localhost:8080/service/helloservice?Wsdl
  5. 我使用這些類在我的客戶端應用程序來調用服務

問題就是服務部署在除8080以外的端口上運行的應用服務器上,客戶端和服務之間的通信從未發生過。我想知道在客戶端使用的存根中沒有硬編碼服務器和端口的存根的最佳方式是什麼。

+0

相關問題:http://stackoverflow.com/questions/3567856/changing-the-url-on-a-webservice-client-generated-with-wsimport – McDowell 2010-08-25 19:25:35

回答

75

客戶端可以通過BindingProvider接口在運行時在服務「端口」中設置端點。

考慮this JAX-WS tutorial中的JAX-WS客戶端。寫這段代碼的另一種方法是:

HelloService service = new HelloService(); 
Hello port = service.getHelloPort(); 
BindingProvider bindingProvider = (BindingProvider) port; 
bindingProvider.getRequestContext().put(
     BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
     "http://foo:8086/HelloWhatever"); 
String response = port.sayHello(name); 

警告:我還沒有下載教程代碼和測試此代碼反對。

+0

謝謝,這就是我一直在尋找。 – user363808 2010-08-31 21:38:46

+0

我正在看這個。顯然,使用最近版本的JAX-WS wsimport生成的代碼,WSDL必須可以在新'HelloService()'執行時指定給wsimport的地址訪問(很久之後綁定提供者甚至有機會進入)。解決這個問題的唯一方法是獲得可以解析的WSDL的本地副本,以便構造函數成功? – 2013-07-18 16:23:07

+0

@ThorbjørnRavnAndersen如果使用內存服務,則可以在生成時將WSDL位置設置爲任何您想要的內容 - 請參閱[wsimport]的參數「-wsdllocation」(http://download.oracle.com/javase/6/docs/technotes/tools /#webservices)工具。但我通常會在非託管客戶端中明確提供它 - [示例](http://illegalargumentexception.blogspot.co.uk/2011/04/java-jax-ws-web-services-and-clients.html#ws_client) 。 – McDowell 2013-07-23 09:26:50

-1

我面臨着同樣的問題,這是可怕的堂妹一旦代碼被移動到生產它總是尋找硬編碼的WSDL位置即Windows的C:........等

我有通過各種帖子和頁面找到答案,但都失敗了,然後通過查看由JAX-WS導入生成的服務類來發現自己。

我不得不像這樣在我的調用類中重寫JAX-WS WSDL位置實現。

URL baseUrl; 
URL wsdlURL = null; 
baseUrl = <your Services>.class.getResource("."); 
try { 
    wsdlURL = new URL(baseUrl, "http://<your path>?wsdl"); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} 

<your Services> yourServices = new <your Services(wsdlURL,new QName("your namespace", "<your service name>")); 
System.out.println(Services.getWSDLDocumentLocation()); 
YourInterface YourInterfacePort = yourServices.getServicePort(); 
BindingProvider bindingProvider = (BindingProvider)YourInterfacePort; 
bindingProvider.getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY,  url); 

YourInterfacePort.methods();

相關問題