定制肥皂响应

时间:2019-02-15 16:51:42

标签: java soap cxf

我正在使用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?

请帮助我,谢谢!

2 个答案:

答案 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
相关问题