2013-10-22 49 views
2

我有一個使用JAXWS自動生成的webservice。這個webservice是一個用於實際實現的模擬器,用於測試。從實際執行的響應看起來是這樣的:JAX-WS:如何將其他XML名稱空間添加到SOAP響應

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:nsc:RFIDCommandEnum="http://tempuri.org/nsc:RFIDCommandEnum.xsd" 
     xmlns:nsc="http://xxx.com/schema/yyy/ltu-tcs" 
     xmlns:nse:DeviceStateEnum="http://tempuri.org/nse:DeviceStateEnum.xsd" 
     xmlns:nse="http://xxx.com/schema/yyy" 
     xmlns:nsl="http://xxx.com/wsdl/yyy/ltu/tcs" 
     xmlns:nst="http://xxx.com/wsdl/yyy/tcs/ltu"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <nsl:setDataResponse> 
      <result>...</result> 
     </nsl:setDataResponse> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

通過模擬器相同的反應是這樣的:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <ns2:getDataResponse xmlns:ns2="http://xxx.com/wsdl/yyy/ltu/tcs"> 
      <result>...</result> 
     </ns2:getDataResponse> 
    </S:Body> 
</S:Envelope> 

現在我已經知道,像xmlns:nsc:RFIDCommandEnum嵌套的命名空間會引起問題,所以我需要讓模擬器像實際實現一樣傳遞這些命名空間。一些谷歌搜索後,我想我應該這樣做:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://xxx.com/schema/yyy/ltu-tcs", 
    xmlns = { 
     @javax.xml.bind.annotation.XmlNs(prefix = "nsc:RFIDCommandEnum", namespaceURI = "http://tempuri.org/nsc:RFIDCommandEnum.xsd"), 
     @javax.xml.bind.annotation.XmlNs(prefix = "nsc", namespaceURI = "http://xxx.com/schema/epm/ltu-tcs"), 
     @javax.xml.bind.annotation.XmlNs(prefix = "nse:DeviceStateEnum", namespaceURI = "http://tempuri.org/nse:DeviceStateEnum.xsd"), 
     @javax.xml.bind.annotation.XmlNs(prefix = "nse", namespaceURI = "http://xxx.com/schema/yyy"), 
     @javax.xml.bind.annotation.XmlNs(prefix = "nsl", namespaceURI = "http://xxx.com/wsdl/yyy/ltu/tcs"), 
     @javax.xml.bind.annotation.XmlNs(prefix = "nst", namespaceURI = "http://xxx.com/wsdl/yyy/tcs/ltu") 
    }, 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.xxx.yyy.tcs.simulator; 

但它不起作用。包com.xxx.yyy.tcs.simulator是web服務的模擬實現類所在的位置。我想我可能需要將這些註釋應用於表示XML內容的自動生成的類,但無法更改這些註釋,因爲它們也用於生產代碼中,我不想用我的名稱空間來污染它。

所以,我想從我的StandardResponse類代表<result>元素推導:

package com.xxx.yyy.tcs.simulator; 

// ... 

@WebService(name = "LTU_for_TCS", targetNamespace = "http://xxx.com/wsdl/yyy/ltu/tcs") 
public class LTU_for_TCS_Impl implements LTUForTCS { 
    // ... 

    public static final class NamespacePollutedStandardResponse extends StandardResponse { 
     private NamespacePollutedStandardResponse(final Application application, 
                final ResultCodeEnum code, 
                final String message) { 
      super(application, code, message); 
     } 
    } 

    @WebMethod 
    @WebResult(name = "result", partName = "result") 
    @Override 
    public GetLTUDataResponse getData(
      @WebParam(name = "application", partName = "application") 
      Application application) { 
     logger.info("getData"); 
     return new NamespacePollutedStandardResponse(getApplicationHeader(), 
      ResultCodeEnum.SUCCESS, 
      "This is the LTU simulator!"); 
    } 
} 

然而,這仍然無法改變我從仿真得到的迴應。現在我想知道:我可以根本改變名稱空間列表StandardResponse嗎?爲什麼它不能這樣工作 - NamespacePollutedStandardResponsesimulator程序包的一部分,所以它應該獲得在XmlSchema屬性中定義的名稱空間,不是嗎?是否有一種方法可以將名稱空間添加到根元素(我只找到如何將其添加到其中一個有效內容元素的信息)?

回答

1

我通過編寫一個javax.servlet.Filter解決了這個問題,它在響應中添加了額外的名稱空間。這不是非常漂亮,但用這種方式儘可能地創造出儘可能接近原始的答案要容易得多。

0

可以添加命名空間的根元素

@XmlRootElement(命名空間= 「http://mynamespace.com」)

相關問題