我正在使用Apache CXF进行Web服务项目。 我不会处理异常并自定义响应:
public class FaultInterceptor extends
AbstractSoapInterceptor {
public FaultInterceptor() {
super(Phase.MARSHAL);
}
public void handleMessage(SoapMessage soapMessage) throws Fault {
Fault fault = (Fault) soapMessage.getContent(Exception.class);
QName faultCode = new QName("11111");
fault.setFaultCode(faultCode);
这就是我得到的答复:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:11111</faultcode>
<faultstring>Message</faultstring>
</soap:Fault>
</soap:Body>
我如何删除文本“ soap:”,只允许11111?
请帮助我,谢谢!
答案 0 :(得分:0)
要自定义SOAP响应,可以实现以下任一方法:
-编辑2019-02-20-
根据Javadoc(和SOAP规范),故障代码必须采用“ prefix:localname”的形式,其中“ prefix”是XML中已声明的XML名称空间的前缀,或者您可以没有前缀-您想要的-如果声明为默认名称空间,例如xmlns="my-custom-faultcode-namespace-uri"
放在某处,例如在soap:Envelope元素中。因此,一种方法-不确定它最简单,但是否符合SOAP标准-包括:
1)为此错误代码创建自己的自定义名称空间
2)尝试使用空字符串作为命名空间前缀更改QName:
QName faultCode = new QName("my-custom-faultcode-namespace-uri", "11111", "");
如果这还不够(我很惊讶这很简单),则可能迫使CXF使用自定义名称空间作为默认名称空间(不带前缀)。根据{{3}},要在CXF中的soap信封上自定义名称空间和前缀,请更改jaxws的'soap.env.ns.map'属性中的Map。
答案 1 :(得分:0)
自从迁移旧系统以使其表现完全相同以来,我一直在寻找完全相同的东西。
我想出了以下解决方案。
)
然后将class SoapFaultEndpointInterceptor extends EndpointInterceptorAdapter
{
private static final Pattern SOAP_CODE_FAULT_SPLITTER = Pattern.compile(":");
@Override
public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception
{
SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext.getResponse();
modifySoapFaultCode(soapResponse);
return super.handleFault(messageContext, endpoint);
}
private void modifySoapFaultCode(SaajSoapMessage soapResponse)
{
try {
SOAPMessage soapMessage = soapResponse.getSaajMessage();
SOAPBody body = soapMessage.getSOAPBody();
SOAPFault soapFault = body.getFault();
modifyFaultCodeIfPresent(soapFault);
} catch (SOAPException e) {
throw new SoapModifiyingException("Modifying faultcode did not work properly.", e);
}
}
private void modifyFaultCodeIfPresent(SOAPFault fault)
{
if (fault != null) {
String newFaultCode = cleanFaultCode(fault.getFaultCode());
fault.setFaultCode(newFaultCode);
}
}
private String cleanFaultCode(String oldFaultCode)
{
String[] cleanFaultCode = SOAP_CODE_FAULT_SPLITTER.split(oldFaultCode);
Assert.isTrue(cleanFaultCode.length == 2, "No proper faultcode provided!");
return cleanFaultCode[1].trim();
}
添加到您的拦截器中,它应该可以工作。
SoapFaultEndpointInterceptor