我怎么可以修改这样的响应的命名空间:
老回应:
<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
}
你最终会与第一种类型的SOAP消息的。
但是,如果你改变响应类看起来像这个:
@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的意义”这两个消息虽然他们看起来不一样。
如果你绝对希望它看起来像,我想你将不得不去“低层次”,并使用像一个SOAP处理器拦截响应并对其进行修改 。 但要知道,这不会是一个简单的任务那张线之前,更改消息。
逻辑处理器有足够的预计改造的消息:
package com.ouertani.slim;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.LogicalMessage;
import javax.xml.ws.handler.LogicalHandler;
import javax.xml.ws.handler.LogicalMessageContext;
import javax.xml.ws.handler.MessageContext;
/**
*
* @author ouertani
*/
public class MyLogicalHandler implements LogicalHandler<LogicalMessageContext> {
@Override
public boolean handleMessage(LogicalMessageContext messageContext) {
/// extract state and amount
int state = 0;
double amount = 200.0;
transform(messageContext, state, amount);
return false;
}
public boolean handleFault(LogicalMessageContext messageContext) {
return true;
}
public void close(MessageContext context) {
}
private void transform( LogicalMessageContext messageContext, int etat, double montant){
LogicalMessage msg = messageContext.getMessage();
String htom = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
"<soap:Body>"+
"<GetAmountResponse xmlns=\"http://ws.dsi.otn.com/dab\">"+
"<etat>"+etat+"</etat>"+
"<montant>"+montant+"</montant>"+
"</GetAmountResponse>"+
"</soap:Body>"+
"</soap:Envelope>";
InputStream is = new ByteArrayInputStream(htom.getBytes());
Source ht = new StreamSource(is);
msg.setPayload(ht);
}
}