2017-04-08 191 views
1

我正在研究必须使用SOAP Web服务的应用程序。我使用CXF从Web服务的WSDL创建了存根。CXF + Java:如何删除xmlns属性

一个请求的元素看起来是这样的:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name="FolderDetailsType", namespace="http://newyorklife.com/services/businessdomain/distributionmanagement/maintenance/maintenancerequestsresponses", propOrder={"any"}) 
public class FolderDetailsType 
    implements Serializable 
{ 
    private static final long serialVersionUID = -6026937020915831338L; 
    @XmlAnyElement 
    protected List<Element> any; 

public FolderDetailsType() {} 

    public List<Element> getAny() 
    { 
    if (this.any == null) { 
    this.any = new ArrayList(); 
    } 
    return this.any; 
    } 
} 

在我的适配器类,在这里我创建整个请求,我创建了名为“businessTypeCode”的元素,并将其添加到元素列表。

FolderDetailsType folderDetails = new FolderDetailsType(); 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance().newDocumentBuilder() 
      Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
      Element businessTypeCode = document.createElement("BusinessTypeCd"); 
      businessTypeCode.setAttribute("code", requestMetadata.getBusinessTypeCode()); 
      folderDetails.getAny().add(businessTypeCode); 

当CXF生成请求XML,它看起来像如下:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
     <ns21:InsertBusinessDocumentRequest xmlns="http://services/businessdomain/distributionmanagement/maintenance/maintenancerequestsresponses" xmlns:ns10="http://schemas/framework/exceptionentry" xmlns:ns11="http://schemas/framework/systemexception" xmlns:ns12="http://schemas/cim/claim/deathclaim" xmlns:ns13="http://schemas/cim/financialcontract/contract" xmlns:ns14="http://schemas/cim/common/name" xmlns:ns15="http://schemas/framework/baserequest" xmlns:ns16="http://schemas/framework/severity" xmlns:ns17="http://schemas/framework/systemexceptionlocation" xmlns:ns18="http://schemas/framework/status" xmlns:ns19="http://schemas/framework/businessexception" xmlns:ns2="http://schemas/framework/baseresponse" xmlns:ns20="http://schemas/framework/fatalexception" xmlns:ns21="http://services/businessdomain/distributionmanagement/maintenance/businessdocumentmaintenance" xmlns:ns3="http://schemas/framework/contextsummary" xmlns:ns4="http://schemas/framework/param" xmlns:ns5="http://schemas/framework/servicestatus" xmlns:ns6="http://schemas/framework/messagetype" xmlns:ns7="http://schemas/framework/businessandservicestatus" xmlns:ns8="http://schemas/framework/businessstatus" xmlns:ns9="http://schemas/framework/serviceexception"> 
      <AsOfDt>2011-01-01-04:00</AsOfDt> 
      <ApplicationInfo> 
       <ApplicationId>ABC</ApplicationId> 
       <ApplicationVersion>1.0</ApplicationVersion> 
      </ApplicationInfo> 
      <FolderInfo> 
       <FolderDetails> 
        <BusinessTypeCd xmlns="" xmlns:ns22="http://services/businessdomain/distributionmanagement/maintenance/maintenancerequestsresponses" code="J40"/> 
       </FolderDetails> 
       <FolderName>GY67898</FolderName> 
       <FolderTypeCd code="ABC"/> 
      </FolderInfo> 
      <MIMETypeCd code="pdf"/> 
     </ns21:InsertBusinessDocumentRequest> 
    </soap:Body> 
</soap:Envelope> 

正如你所看到的,不像XML的其他元素,在BusinessTypeCd元素有两个的xmlns标签 - 一个空和一个与命名空间:

<BusinessTypeCd xmlns="" xmlns:ns22="http://services/businessdomain/distributionmanagement/maintenance/maintenancerequestsresponses" code="J40"/> 

但我希望能像其他元素生成的元素,如:

<BusinessTypeCd code="J40"/> 

有人可以告诉我如何从BusinessTypeCd元素中删除xmlns标签。任何帮助真的很感激。

回答

0

我找到了解决我的问题的方法。如果有人在此寻找答案,请在此发帖。我采取了不同的方法。我让CXF创建SOAP消息,然后使用CXF自定义拦截器更改消息元素。

配置XML:

<!-- CXF Bus Configuration --> 

<cxf:bus name="clientBus"> 
    <cxf:outInterceptors> 
     <bean class="com.xxx.xxx.xxx.xxx.CustomMessageInterceptor" /> 
    </cxf:outInterceptors> 
    <cxf:features> 
     <cxf:logging/> 
    </cxf:features> 
</cxf:bus> 

CustomMessageInterceptor.java

package com.xxx.xxx.xxx.xxx; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import org.apache.commons.io.IOUtils; 
import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor; 
import org.apache.cxf.io.CachedOutputStream; 
import org.apache.cxf.message.Message; 
import org.apache.cxf.phase.AbstractPhaseInterceptor; 
import org.apache.cxf.phase.Phase; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 


@Component 
public class CustomMessageInterceptor extends AbstractPhaseInterceptor<Message> { 

    public CustomMessageInterceptor() { 
     super(Phase.PRE_STREAM); 
     addBefore(SoapPreProtocolOutInterceptor.class.getName()); 
    } 

    private Logger log = LoggerFactory.getLogger(this.getClass()); 

    public void handleMessage(
      Message message) { 

     OutputStream os = message.getContent(OutputStream.class); 

     CachedStream cs = new CachedStream(); 
     message.setContent(OutputStream.class, cs); 

     message.getInterceptorChain().doIntercept(message); 

     try { 
      cs.flush(); 
      IOUtils.closeQuietly(cs); 
      CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class); 

      String currentEnvelopeMessage = IOUtils.toString(csnew.getInputStream(), "UTF-8"); 
      csnew.flush(); 
      IOUtils.closeQuietly(csnew); 

      if (log.isDebugEnabled()) { 
       log.debug("Outbound message: " + currentEnvelopeMessage); 
      } 

      String res = changeOutboundMessage(currentEnvelopeMessage); 
      if (res != null) { 
       if (log.isDebugEnabled()) { 
        log.debug("Outbound message has been changed: " + res); 
       } 
      } 
      res = res != null ? res : currentEnvelopeMessage; 

      InputStream replaceInStream = IOUtils.toInputStream(res, "UTF-8"); 

      IOUtils.copy(replaceInStream, os); 
      replaceInStream.close(); 
      IOUtils.closeQuietly(replaceInStream); 

      os.flush(); 
      message.setContent(OutputStream.class, os); 
      IOUtils.closeQuietly(os); 

     } 
     catch (IOException ioe) { 
      log.error("Unable to perform change.", ioe); 
      throw new RuntimeException(ioe); 
     } 
    } 

    protected String changeOutboundMessage(
      String currentEnvelope) { 
     currentEnvelope = currentEnvelope.replace("<ClruInsert xmlns=\"\" xmlns:ns22=\"http://services/businessdomain/distributionmanagement/maintenance/maintenancerequestsresponses\">", "<ClruInsert>"); 
     currentEnvelope = currentEnvelope.replace("<BusinessTypeCd xmlns=\"\" xmlns:ns22=\"http://services/businessdomain/distributionmanagement/maintenance/maintenancerequestsresponses\"", "<BusinessTypeCd"); 

     return currentEnvelope;  
    } 

    private class CachedStream extends CachedOutputStream { 
     public CachedStream() { 
      super(); 
     } 
    } 
} 

它的工作就像一个魅力! :)

0

变化

Element businessTypeCode = document.createElement("BusinessTypeCd"); 

Element businessTypeCode = document.createElementNS(
    "http://services/businessdomain/distributionmanagement/maintenance/maintenancerequestsresponses", 
    "BusinessTypeCd"); 

,看看https://docs.oracle.com/javase/8/docs/api/org/w3c/dom/Document.html#createElementNS-java.lang.String-java.lang.String-更多的细节。

+0

@Alochi我试过你的解决方案。并创建如下的元件:\t \t \t \t \t 它不起作用 – tarares