Java 如何使用拦截器更改soap故障中的故障代码?

Java 如何使用拦截器更改soap故障中的故障代码?,java,spring,soap,spring-ws,Java,Spring,Soap,Spring Ws,当前中的soap故障中的故障代码有问题,如下所示: <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header/> <env:Body> <env:Fault xmlns:ns0="http://xmlns.telenet.be/oss/ninas/v001"> <faultcode>ns0:B

当前中的soap故障中的故障代码有问题,如下所示:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header/>
   <env:Body>
      <env:Fault xmlns:ns0="http://xmlns.telenet.be/oss/ninas/v001">
         <faultcode>ns0:B-NONUNIQUE-WORKORDERID</faultcode>
         <faultstring>Work order ID is not unique</faultstring>
         <detail/>
      </env:Fault>
   </env:Body>
</env:Envelope>

ns0:B-非均匀-修井里德
工单ID不唯一
但我需要这样(没有名称空间前缀):

B-非均匀-工作区
我已经尝试过的:

  • 首先,我用SpringAOP拦截soap错误,并实现EndpointInterceptor以获取messageContext(org.springframework.ws.context)
  • 消息上下文有方法“setResponse”-它非常适合我使用WebServiceMessage的API,它的子类非常差,我无法以这种方式更改响应的内部
  • 尝试了其他几种方法,但情况变得更糟
有人能提示一下如何获取和更改故障代码吗?
或者避免在错误代码中出现名称空间前缀

经过几个小时的调查,我发现了一个相当丑陋的解决办法。首先,我的xml配置中有一个spring拦截器:

<sws:interceptors>
        <bean id="attachmentInterceptor"
              class="com.net.tel.interceptors.MessageInterceptor">
        </bean>
</sws:interceptors>
正如您所见,我得到的响应是一个字符串,为了修改它,我编写了一个简单(丑陋)的解析器:

私有字符串faultCodeModifier(字符串消息){
StringBuilder sb=新的StringBuilder();
字符串[]arr=message.split(“”[1];
字符串c=a.split(“:”[1];
b=arr[i]。拆分(“>”[0]+“>”+c;
}

如果(!“”.equals(arr[i])sb.append(经过数小时的调查,我发现了一个非常糟糕的解决方案。首先,我的xml配置中有一个spring拦截器:

<sws:interceptors>
        <bean id="attachmentInterceptor"
              class="com.net.tel.interceptors.MessageInterceptor">
        </bean>
</sws:interceptors>
正如您所见,我得到的响应是一个字符串,为了修改它,我编写了一个简单(丑陋)的解析器:

私有字符串faultCodeModifier(字符串消息){
StringBuilder sb=新的StringBuilder();
字符串[]arr=message.split(“”[1];
字符串c=a.split(“:”[1];
b=arr[i]。拆分(“>”[0]+“>”+c;
}
如果(!“”.等于(arr[i])某人追加(“
public class MessageInterceptor extends EndpointInterceptor {

    private static final transient Logger log = LoggerFactory.getLogger(NCOssNinasAttachmentInterceptor.class);

    private SoapMessageFactory soapMessageFactory;

    @Autowired
    private NCOssNinasAttachmentInterceptor(SoapMessageFactory soapMessageFactory) {
        this.soapMessageFactory = soapMessageFactory;
    }

    @Override
    public void afterCompletion(MessageContext messageContext, Object endpoint, Exception ex) throws Exception {
        SaajSoapMessage message = (SaajSoapMessage) messageContext.getResponse();
        final OutputStream s = new ByteArrayOutputStream();
        message.writeTo(s);
        log.info("SOAP RESPONSE: " + s.toString());
        String modifiedMsg = faultCodeModifier(s.toString());
        log.info("MODIFIED RESPONSE: " + modifiedMsg);
        final InputStream is1 = new ByteArrayInputStream(modifiedMsg.getBytes());
        SoapMessage m = soapMessageFactory.createWebServiceMessage(is1);
        if (messageContext.hasResponse()) messageContext.clearResponse();
        messageContext.setResponse(m);
        log.info("NEW RESPONSE WAS SET");
    }
private String faultCodeModifier(String message) {
        StringBuilder sb = new StringBuilder();
        String[] arr = message.split("<");
        for (int i = 0; i < arr.length; i++) {
            String b = arr[i];
            if (arr[i].contains("faultcode") && !arr[i].contains("/")) {
                String a = arr[i].split(">")[1];
                String c = a.split(":")[1];
                b = arr[i].split(">")[0] + ">" + c;
            }
            if (!"".equals(arr[i])) sb.append("<" + b);
        }
        return sb.toString();
    }