2010-10-11 3 views
1

Y at-il un moyen de modifier le message SoapBody en utilisant Apache CXF? J'ai essayé d'utiliser la fonction Intercepteurs avec le mode Phase.SEND pour essayer d'ajouter un schéma XML avec un résultat dans SoapBody. Je n'ai pas eu de chance.Comment ajouter un schéma XML dans SoapBody de SoapMessage dans Apache CXF?

Le problème était que je veux valider le message de résultat avec le schéma xml. La sortie actuelle de SoapBody a envoyé un message de résultat avec le schéma xml qui utilisait la référence de l'emplacement de schéma qui n'était pas disponible à l'emplacement cible.

Afin de valider le message de réponse de résultat, j'ai ajouté "schema-validation-enabled" comme vrai dans ResponseContext dans BindingProvider; Cependant, je ne suis pas sûr que cela fonctionne ou non.

J'ai essayé d'ajouter/attacher un schéma original au lieu d'utiliser sa référence avec un message de réponse pour SoapBody. Est-il possible d'utiliser l'annotation ou toute autre méthode pour utiliser le schéma xml donné pour la validation?

Une idée, et une réponse sont appréciées.

<?xml version="1.0" encoding="utf-8"?> 
    <xs:schema id="resultSet" targetNamespace="http://www.xxx.com/" xmlns:mstns="http://www.xxx.com/" xmlns="http://www.xxx.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:app1="http://www.xxx.com/ResultSet.xsd"> 
     <xs:import namespace="http://www.xxx.com/ResultSet.xsd" schemaLocation="RalsDeviceService_app1.xsd" /> 
     <xs:element name="resultSet" msdata:IsDataSet="true" msdata:Locale="en-US"> 
     <xs:complexType> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element ref="app1:ResultSet" /> 
      </xs:choice> 
     </xs:complexType> 
     </xs:element> 
    </xs:schema> 
    <resultSet xmlns="http://www.xxx.com/"> 
     <ns2:ResultSet xmlns:ns2="http://www.xxx.com/ResultSet.xsd"> 
     <ns2:Results> 
     ... 
     .. 
     . 
    </resultSet> 

Répondre

0

sur ce problème j'ai travaillé trois jours =) La manière de l'Inteceptor n'est pas fausse. Cette i ma implémentation simple de démonstration

public static class MySendingReturn extends AbstractPhaseInterceptor<Message> { 

    public MySendingReturn() { 
     super(Phase.SEND); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     XMLStreamWriter content = message.getContent(XMLStreamWriter.class); 
     try { 

      MySchema context = new MySchema(); 
      content.writeStartElement("testOperationWithParameter"); 
      content.writeStartElement("returnValue"); 
      content.writeCharacters("Halllllo-Return"); 
     } catch (XMLStreamException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

L'élément actuel du XMLStreamWriter est l'élément BODY du SoapMessage. Cet Interceptor je m'inscris sur mon instance de service:

service.getOutInterceptors().add(new MySendingReturn()); 
Questions connexes