2013-02-14 65 views
4

我很新的Web服務,很抱歉,如果我寫了很多錯事......Web服務,在WSDL地址動態地址

我創建了一些Java類和生成的WSDL,所以我有一個自下而上的網絡服務。 我的一切部署(在EAR),並呼籲

http://localhost:7159/chc2/services/WebServiceManager 

來調用Web服務。它的工作,我獲得了結果。

問題是我需要在其他服務器上部署應用程序,顯然是url的第一部分,本地ip不會一樣。

該URL是由我與WSDL聲明:

<wsdlsoap:address location="http://localhost:7159/chc2/services/WebServiceManager"/> 

我的問題是:有一種方式來獲得鏈接的IP部分在的.wsdl一個動態的方式? 我在網上找到了一些在Java中執行它的方法,但我直接調用.wsdl,而不是通過java傳遞......我想如果在.wsdl中有這樣的方法。

我的其他配置文件是server-config.wsdd和web.xml。

謝謝:)

回答

3

某些應用程序服務器將允許您提交包含具有虛擬地址位置的WSDL的Web服務:

<soap:address location="REPLACE_WITH_ACTUAL_URL"/> 

部署時,他們會用實際的URL替換這個值! Glassfish肯定支持這個功能(實際上,我認爲你可以把任何你想要的地址位置值,Glassfish會自動替換它),並根據this linkJBoss也支持這個'功能'。 HTH。

+0

這非常有趣,即使我現在嘗試,它不能與weblogic 10.3.5一起工作(我非常希望這可以工作!)。非常感謝您的回答:) – Pipkin 2013-02-19 08:38:43

+0

@Pipkin歡迎您!隨意,如果你認爲它有用:) – 2013-02-19 08:41:00

+0

如果你得到一個NPE像 '顯示java.lang.NullPointerException 在org.apache.axis2.description.AxisEndpoint.calculateEndpointURL(AxisEndpoint.java:186) 組織來給予好評它.apache.axis2.description.AxisService.setPortAddress(AxisService.java:1594) ...' 這就是Apache-Axis2: 'org.apache.axis2.description.AxisService.setPortAddress(javax.wsdl.Definition definition,java .lang.String requestIP)'' ... \t如果(existingAddress == NULL \t \t || existingAddress.equals( 「REPLACE_WITH_ACTUAL_URL」)){ \t \t // ...' – udoline 2017-03-09 17:31:55

1

據我瞭解,你的問題是:當您部署其他服務器上的web服務你會如何調用web服務?

您的服務器顯然是節點/集羣的一部分。在Java EE應用程序服務器上,例如在WebSphere上,plugin-config.xml是您可以配置傳入/傳出http端口的位置。

IBM HTTP Web Server將通過plugin-config.xml與您的應用程序服務器一起配置。這會將您的webserice顯示爲http://:port/webserviceURI。這是您將用來調用獨立於應用程序服務器IP的Web服務的URL。

+0

是(感謝您的解釋)的方式,但問題是,調用它,我應該定義在港口「的wsdlsoap:地址位置」以一種動態的方式,以便它可以部署在不同的服務器上,而無需在.wsdl上手動修改它(在我剛開始寫的例子中,它顯然是以靜態方式聲明的)!我希望我已經解釋了我自己:D – Pipkin 2013-02-15 10:07:44

1

動態使用SWS標籤放置在[servler名] -servlet.xml後綴

<sws:dynamic-wsdl 
     id="getemployeeDetails" 
     portTypeName="EmpService" 
     locationUri="/empService" 
     targetNamespace="http://www.example.org/"> 
     <sws:xsd location="/WEB-INF/employee.xsd"/> 

    </sws:dynamic-wsdl> 

這樣的服務器

問候

託管時,你可以有網址爲動態生成通過WSDL XSD

Anshul

+0

我會盡快嘗試。非常感謝您的幫助! – Pipkin 2013-02-19 13:14:54

0

這是我們可以動態地改變WSDL位置的URL

import java.io.File; 
import java.io.IOException; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.xml.sax.SAXException; 

public class WsdlDynamicPath { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     try { 
      changePath(); 
     } catch (ParserConfigurationException | SAXException | IOException | 
TransformerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void changePath() throws ParserConfigurationException, SAXException, IOException, TransformerException{ 
     String filepath = "path to wsdl\\demo.wsdl"; //Give your wsdl file path 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(filepath); 

     Node address= doc.getElementsByTagName("soap:address").item(0); 

     NamedNodeMap attr = address.getAttributes(); 
     Node nodeAttr = attr.getNamedItem("location"); 
     nodeAttr.setTextContent("new path to wsdl"); 

     // write the content into xml file 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File(filepath)); 
     transformer.transform(source, result); 
    } 

}