我有一個使用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
嗎?爲什麼它不能這樣工作 - NamespacePollutedStandardResponse
是simulator
程序包的一部分,所以它應該獲得在XmlSchema
屬性中定義的名稱空間,不是嗎?是否有一種方法可以將名稱空間添加到根元素(我只找到如何將其添加到其中一個有效內容元素的信息)?