2016-07-15 4 views
1

Ist es in einfacher Weise möglich, eine Zeichenfolge innerhalb eines cdata-Tags ohne auslaufende Zeichen zu senden? Ich verwendete @ XmlCDATA-Tag für diesen String und es ändert seinen Wert zu, wenn ich Marshaller verwende. Aber wenn ich Request an SoapUI senden möchte, fügt es das nicht hinzu. Wenn ich dieses Tag manuell hinzufüge (zum Beispiel im Setter), entkommt es Zeichen.Java-Web-Service-Client cdata-Tag

Beispiel: Wenn ich Einweiser verwende ich bekommen:

<?xml version="1.0" encoding="UTF-8"?> 
<getRequest xmlns="pl/nosd/Get"> 
    <ClientNumber> 
     <![CDATA[<CLIENT_NUMBER>]]> 
    </ClientNumber> 
</getRequest> 

Und das ist richtig.

Aber wenn ich dies senden möchten, mit Service soapUI:

sync_Customer_Service = new Sync_Customer_Service(); 
Customer_PortType customer_PortType = sync_Customer_Service.getCustomer_HTTPSPort(); 
GetRequest getRequest = new GetRequest(); 
getRequest.setClientNumber("<CLIENT_NUMBER>"); 
customer_PortType.get(getRequest); 

i erhalten:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <ns2:GetRequestMessage xmlns="pl/nosd/Get" xmlns:ns2="http://pl/nosd/Get/xsd"> 
     <ClientNumber>&lt;CLIENT_NUMBER></ClientNumber> 
     </ns2:GetRequestMessage> 
    </S:Body> 
</S:Envelope> 

Ich habe jaxb.properties Datei mit: javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory

und ich fügte @XMLCdata Anmerkung zu GetRequest Klasse:

public class GetRequest { 
    @XmlCDATA 
    @XmlElement(name = "ClientNumber", required = true) 
    protected String clientNumber; 
    public String getClientNumber() { 
     return clientNumber; 
    } 
    public void setClientNumber(String value) { 
     this.clientNumber = value; 
    } 

Service- und PortType-Klassen wurden von jdeveloper mithilfe der Web-Service-Proxy-Option generiert.

+1

Was ist der Punkt CDATA mit anstelle einer entgangene Zeichenfolge? Dies sind zwei Darstellungen für die gleichen Daten. – vanje

+0

System, ich sende Anfrage zu erwartet, dass Formular. – krzysiek

Antwort

0

Ich fand eine Lösung. Workaround ist keine Schönheit, aber es funktioniert. In Client-Klasse hinzufügen I-Handler:

BindingProvider bp = (BindingProvider)account_PortType; 
    List<Handler> handlerList = bp.getBinding().getHandlerChain(); 
    RequestResponseHandler reqResHelper = null; 
    handlerList.add(new HeaderHandler()); 
    bp.getBinding().setHandlerChain(handlerList); 

Und in Handler I Wert ersetzen mit Cdata Wert:

public class HeaderHandler implements SOAPHandler<SOAPMessageContext> { 
      private static final String SYSTEM_ID = "pl/Customer.wsdl"; 
      private static final String NODE_NAME = "ClientNumber"; 
      public boolean handleMessage(SOAPMessageContext context) { 
    try{ 
     Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
     if (outboundProperty.booleanValue()) { 
      Object o = context.get(LogicalMessageContext.WSDL_DESCRIPTION); 
      org.xml.sax.InputSource is = (org.xml.sax.InputSource)o; 
      if(is.getSystemId().contains(SYSTEM_ID)){ 
       SOAPMessage message = context.getMessage(); 
       SOAPBody body = message.getSOAPBody(); 
       Node e =getNode(body.getChildNodes()); 
       CDATASection cdataSection = message.getSOAPPart().createCDATASection(e.getFirstChild().getNodeValue()); 
       e.replaceChild(cdataSection, e.getFirstChild()); 
      } 
     } 
    }catch(Exception e){ 
     //TODO logować 
    } 

    return true; 

} 

public Node getNode(NodeList a){ 
    if(a!=null&&a.getLength()>0){ 
     for(int i = 0;i<a.getLength();i++){ 
      Node b = a.item(i); 
      if(b.getNodeName()!=null && b.getNodeName().contains(NODE_NAME)){ 
       return b; 
      } 
      Node node = getNode(b.getChildNodes()); 
      if(node!=null){ 
       return node; 
      } 
     } 
    } 

    return null; 
} 

In soapui wir sehen:

<ns6:ClientNumber> 
    <![CDATA[data]]> 
</ns6:ClientNumber>