2012-04-11 7 views
4

Szenario:Wie mische ich Namespace-Generierung in SOAP :: Lite?

  • Der Client ist ein Perl-Skript SOAP::Lite verwenden.
  • Der Server ist eine Java-basierte Anwendung, die Spring und CXF verwendet.

Mein Kunde ist dabei die folgende SOAP-Anforderung auf der WSDL basiert:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <createFolder xmlns="http://xyz.com/"> 
      <parentId xsi:type="xsd:string">1</parentId> 
      <folderName xsi:type="xsd:string">Test</folderName> 
     </createFolder> 
    </soap:Body> 
</soap:Envelope> 

Dieser Antrag gegen CXF fehl. Nach mehreren Untersuchungen habe ich herausgefunden, dass die folgende manuell erzeugten Anforderung funktioniert:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xyz="http://xyz.com/"> 
    <soap:Body> 
     <xyz:createFolder> 
      <parentId xsi:type="xsd:string">1</parentId> 
      <folderName xsi:type="xsd:string">Test</folderName> 
     </xyz:createFolder> 
    </soap:Body> 
</soap:Envelope> 

Der Unterschied die Namespace-Definition für das Element ist createFolder.

Meine Frage ist: Wie kann ich SOAPLite konfigurieren, um die funktionierende SOAP-Anfrage zu erstellen?

Oder umgekehrt: Wie kann CXF konfiguriert werden, um den SOAP :: Lite-Anforderungsstil zu akzeptieren?

+0

Es könnte auch ein Konfigurationsproblem von CXF sein. – Philipp

Antwort

3

Schauen Sie unter ns. Wenn ein für Wurzelelement des Fragments ähnlich qualifizierten Namen gibt

mit dem folgenden:

SOAP::Lite->new->proxy('http://somewhere.com') 
    ->ns('http://xyz.com/', 'xyz')->createFolder( 
     SOAP::Data->new(name => 'parentId', value => 1, type => 'xsd:string') 
    , SOAP::Data->new(name => 'folderName', value => 'Test') 
    ); 

Ich habe folgendes:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xyz="http://xyz.com/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
> 
    <soap:Body> 
    <xyz:createFolder> 
     <parentId xsi:type="xsd:string">1</parentId> 
     <folderName xsi:type="xsd:string">Test</folderName> 
    </xyz:createFolder> 
    </soap:Body> 
</soap:Envelope> 

Und ich denke, das ist, was Sie wollen.