Comment Modifier Le XML Brut, message d'un émetteur CXF Demande?
Je voudrais modifier un sortant une Requête SOAP.
Je voudrais enlever 2 nœuds xml à partir de l'Enveloppe du corps.
J'ai réussi à mettre en place un Intercepteur et obtenir le générés Chaîne de valeur de l'ensemble de messages au point de terminaison.
Cependant, le code suivant ne semble pas fonctionner tant que le message sortant est pas modifié comme prévu. Quelqu'un aurait-il un code ou des idées sur comment faire cela?
public class MyOutInterceptor extends AbstractSoapInterceptor {
public MyOutInterceptor() {
super(Phase.SEND);
}
public void handleMessage(SoapMessage message) throws Fault {
//Get message content for dirty editing...
StringWriter writer = new StringWriter();
CachedOutputStream cos = (CachedOutputStream)message.getContent(OutputStream.class);
InputStream inputStream = cos.getInputStream();
IOUtils.copy(inputStream, writer, "UTF-8");
String content = writer.toString();
//remove the substrings from envelope...
content = content.replace("<idJustification>0</idJustification>", "");
content = content.replace("<indicRdv>false</indicRdv>", "");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(content.getBytes(Charset.forName("UTF-8")));
message.setContent(OutputStream.class, outputStream);
}
OriginalL'auteur kiwifrog | 2011-08-02
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce problème aujourd'hui. Après bien des pleurs et des grincements de dents, j'ai été en mesure de modifier la StreamInterceptor classe dans le configuration_interceptor démo qui vient avec le CXF source:
La
soapMessage
variable contiennent l'intégralité du message SOAP. Vous devriez être capable de manipuler le message de savon, rincer à un flux de sortie et de faire unmessage.setContent(OutputStream.class...
appel pour mettre vos modifications sur le message. Ce n'est assorti d'aucune garantie, car je suis assez nouveau à CXF moi-même!Remarque: CachedStream est une classe privée dans le StreamInterceptor classe. N'oubliez pas de configurer votre intercepteur à exécuter dans le PRE_STREAM phase, de sorte que le SAVON d'intercepteurs ont une chance d'écrire le message SOAP.
Dans votre exemple, le OutputStream os est déclarée mais non utilisés: comment en avez-vous besoin dans ce code?
OriginalL'auteur Jpnh
Basé sur le premier commentaire, j'ai créé une classe abstraite qui peut facilement être utilisé pour modifier l'ensemble de l'enveloppe soap.
Juste au cas où quelqu'un veut un prêt-à-utiliser le code de la partie.
Vraiment sympa! Merci!
D'où vient
CachedStream
venir? Je ne vois pas une importation pour elle et ne peut pas le trouver.Si quelqu'un est intéressé comment faire pour la joindre à un générés Apache Cxf client, il faut simplement utiliser
Client client = ClientProxy.getClient(someServicePort); client.getInInterceptors().add(new MessageChangeInterceptor() { .. });
de sorte qu'il sera possible de modifier RAW réponseJe suis désolé... C'est terriblement code cassé. travail, mais comme @shx expériences, c'est de la pure chance. D'entrée et les flux de Sortie sont créées pour des a pas de raisons, vidés quand ils sont vides, échangé dans le message pour aucune raison, fermé lorsque l'auteur n'a pas l'ouvrir (ce qui signifie qu'il est probablement le double de clôture de cours d'eau), et ainsi de suite. De Plus il ne fonctionne pas du tout si le message écrit est fait par le biais d'un écrivain au lieu d'un flux de sortie (par exemple, le SAVON sur JMS avec messageType = TEXTE). Le principe de base est bonne (à l'aide d'un intercepteur, l'accès au cours d'eau...), mais la mise en œuvre est vraiment mauvais.
OriginalL'auteur snowindy
La suite est capable de proposer du côté serveur exceptions. L'utilisation de l'os.close() à la place de IOUtils.closeQuietly(os) dans la solution précédente est également en mesure de proposer des exceptions.
OriginalL'auteur Md Atikur Rahman