如何修改响应的命名空间,如下所示:
旧的回应:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:GetAmountResponse xmlns:ns2="http://ws.dsi.otn.com/dab"> <etat>0</etat> <montant>500.0</montant> </ns2:GetAmountResponse> </soap:Body> </soap:Envelope>
想要的新回应:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetAmountResponse xmlns="http://ws.dsi.otn.com/dab"> <etat>0</etat> <montant>500.0</montant> </GetAmountResponse> </soap:Body> </soap:Envelope>
我想删除ns2 namespce前缀.
解决方法
在第一种情况下,GetAmountResponse位于命名空间http://ws.dsi.otn.com/dab中,而etat和montant位于默认(空)命名空间中.
在您想要的新消息中,GetAmountResponse,etat和montant都在命名空间http://ws.dsi.otn.com/dab中.
可以从类的名称空间控制名称空间.在所有名称空间中使用相同的名称空间,您将在同一名称空间中使用它们,保留具有默认值的类,并且它们默认为空名称空间.
例如,如果您在Web服务类中有类似的内容:
@WebMethod public @WebResult(name = "getAmountResponse",targetNamespace = "http://ws.dsi.otn.com/dab") AmountResponse getAmount( @WebParam(name = "getAmountRequest",targetNamespace = "http://ws.dsi.otn.com/dab") AmountRequest request) { AmountResponse response = new AmountResponse(); response.setEtat(0); response.setMontant(500.0); return response; }
使用这样的响应类:
@XmlRootElement public class AmountResponse { private int etat; private double montant; // getter and setters omitted }
你将得到第一种肥皂信息.
但是,如果您将响应类更改为以下内容:
@XmlRootElement(namespace = "http://ws.dsi.otn.com/dab") @XmlAccessorType(XmlAccessType.NONE) public class AmountResponse { @XmlElement(namespace = "http://ws.dsi.otn.com/dab") private int etat; @XmlElement(namespace = "http://ws.dsi.otn.com/dab") private double montant; // getters and setter omitted }
您将把所有标记放在同一个命名空间中,并获得与您想要的新类型消息等效的内容.我说相当于因为我不认为你会得到这个:
<GetAmountResponse xmlns="http://ws.dsi.otn.com/dab"> <etat>0</etat> <montant>500.0</montant> </GetAmountResponse>
相反,它更有可能得到这样的东西:
<ns2:getAmountResponse xmlns:ns2="http://ws.dsi.otn.com/dab"> <ns2:etat>0</ns2:etat> <ns2:montant>500.0</ns2:montant> </ns2:getAmountResponse>
这两个消息的“XML含义”相同,尽管它们看起来不一样.
如果你绝对希望它看起来像这样,我认为你必须去“低级别”并使用类似a SOAP handler to intercept the response and modify it的东西.但要注意,在它上线之前更改消息不是一项微不足道的任务.