IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

Intercepter flux XML lors de l'appel d'un web service (jaxrs et cxf) ainsi que les paramètres du webservice


Sujet :

Services Web Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Points : 24
    Points
    24
    Par défaut Intercepter flux XML lors de l'appel d'un web service (jaxrs et cxf) ainsi que les paramètres du webservice
    Bonjour,
    j'utilise jax-rs pour le développement de web services avec REST de manière assez commune.

    Conf spring :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <jaxrs:server id="orgWebService" transportId="http://cxf.apache.org/transports/http"
    		address="/appel">
    		<jaxrs:serviceBeans>
    			<bean class="toto.webservice.jaxrs.OrgImpl" />
    		</jaxrs:serviceBeans>
    	</jaxrs:server>
    Puis dans mon web service (classe OrgImpl.java) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @POST
    	@Path("/appel")
    	public Resultat  appelAvance(
    			@PathParam("code") String code,
    			Demande demande)
    Je souhaiterais intercepter les flux xml entrants et sortants et les loguer en base de données. Je souhaiterais aussi loguer en même temps dans la table le contenu du paramètre "Demande" de mon webservice.

    Après une recherche j'ai mis en place des intercepteurs dans spring :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <bean id="requestInterceptor" class="toto.interceptor.RequestInterceptor" />
    	<bean id="responseInterceptor" class="toto.interceptor.ResponseInterceptor" />
     
    	<cxf:bus>
    		<cxf:inInterceptors>
    			<ref bean="requestInterceptor" />
    		</cxf:inInterceptors>
    		<cxf:outInterceptors>
    			<ref bean="responseInterceptor" />
    		</cxf:outInterceptors>
    	</cxf:bus>
    Puis dans mon intercepteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public class RequestInterceptor extends AbstractPhaseInterceptor<Message> {
        public RequestInterceptor() {
            super(Phase.RECEIVE);
        }
     
        /**
         * Gestion de la trame entrante
         * @param message objet transmis à l'intercepteur contenant les informations de la trame (notamment le content du body)
         * */
        public void handleMessage(Message message) {
     
        	try{
        		InputStream is = message.getContent(InputStream.class);
        		XMLStreamReader toto = message.getContent(XMLStreamReader.class);
            	CachedOutputStream os = new CachedOutputStream();
                IOUtils.copy ( is, os );
                os.flush ( );
                message.setContent(InputStream.class, os.getInputStream());
                Message message2 = ((XMLMessage) message).getMessage();
                is.close ( );
     
                System.out.println ("La trame entrante est : " + IOUtils.toString(os.getInputStream()));
                os.close ( );	
        	}
        	catch (Exception e) {
    			throw new RuntimeException(e);
    		}
     
        }
     
        /**
         * Appelé pour tous les intercepteurs lorsque l'exécution normale de la chaîne a été interrompue pour une raison quelconque
         * */
        public void handleFault(Message messageParam) {
        }
    }
    Le problème est que j'arrive à intercepter le flux XML en tant que chaîne de caractère mais je n'arrive pas à accéder à l'objet Demande qui est le paramètre de mon web service. Pourtant quand je rentre en debug je vois bien ce paramètre (dans la variable contents de XMLMessage).

    Je ne veux bien sûr par parser mon XML avec un dom pour retrouver les infos c'est pour ça que je veux accéder à l'objet désérialisé.

    Quelqu'un aurait une idée svp ? j'ai vu qu'il existait des filters mais je ne sais pas si ça résout mon problème.

    En vous remerciant par avance.

    PS : merci de ne pas tenir compte des chemins des web services etc...je les ai changé pour cause de confidentialité

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Points : 24
    Points
    24
    Par défaut
    j'ai fini par trouver la solution. Il suffit d'un seul intercepteur "out" pour les trames entrantes et sortantes.

    config spring :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <bean id="intercepteurTrame" class="toto.package.IntercepteurTrame"/>
     
       	<cxf:bus>
            <cxf:outInterceptors>
                <ref bean="intercepteurTrame"/>
            </cxf:outInterceptors>
        </cxf:bus>
    Puis dans mon intercepteur pour récup l'objet ET la trame que ca soit pour la requête ou la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    @Component
    public class IntercepteurTrame extends AbstractPhaseInterceptor<Message> {
     
    	public IntercepteurTrame() {
    		super(Phase.PRE_PROTOCOL);
    	}
     
    	/**
         * Gestion de la trame sortante.
         * @param message objet transmis à l'intercepteur contenant les informations de la trame
         * */
    	public void handleMessage(Message message) throws Fault {
     
    		/*1. Récupérer du contenu du message*/
    		List<?> contents = message.getContent(List.class); 
    		EntiteEnEntree entiteEnEntree = null;
    		EntiteEnSortie entiteEnSortie = null;
     
    		/*2. Récupérer le contenu du message*/
    		if (contents != null) { 
    	    for (int i=0; i<contents.size(); i++) { 
                	if (contents.get(i) instanceof EntiteEnEntree ) { 
                    	entiteEnEntree = (EntiteEnEntree )contents.get(i); 
                    	break;
                    }
                	else if (contents.get(i) instanceof EntiteEnSortie ) { 
                    	entiteEnSortie  = (EntiteEnSortie ) contents.get(i); 
                    	break;
                    } 
                } 
            }
    		else {
    			logger.debug("Journalisation : le contenu du message est vide");
    		}
     
    		/*3. Ajout d'un callback pour récupérer le flux XML en entrée pour l'entité correspondate (ici en sortie du webservice mais possibilité de faire pareil pour l'entité en entrée*/
     
    			OutputStream os = message.getContent(OutputStream.class);
    			CacheAndWriteOutputStream cwos = new CacheAndWriteOutputStream(os);
    			message.setContent(OutputStream.class, cwos);
    			cwos.registerCallback(new ObjetTrameCallBack(entiteEnSortie));
    	}
    }
    Enfin la définition du callback pour récup le flux xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    class ObjetTrameCallBack implements CachedOutputStreamCallback {
     
    	private EntiteEnSortie entiteEnSortie;
     
    	public ObjetTrameCallBack () {
    	}
     
    	public ObjetTrameCallBack(EntiteEnSortie entiteEnSortie) {
    		this.entiteEnSortie = entiteEnSortie;
    	}
     
    	/**
             * Traitement avant fermeture du flux de sortie.
             * @param cashedOutputStream
             * */
    	public void onClose(CachedOutputStream cashedOutputStream) {
    		try {
    			if (cashedOutputStream != null) {
    				/*1. Recuperer la trame*/
    				String trame = IOUtils.toString(cashedOutputStream.getInputStream());
     
    				/*Associer le flux XML sortant à l'entité en sortie*/
    				System.out.println(entiteEnSortie.toString() + " avec trame associée: " +  trame);			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
     
    	public void onFlush(CachedOutputStream cashedOutputStream) {
    	}
    }
    En espérant que ça aidera certaines personnes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Temps lors du premier appel d'un Web Service
    Par kirsito dans le forum Services Web
    Réponses: 6
    Dernier message: 24/08/2012, 09h40
  2. Enum WSDL null lors de l'appel d'un web service
    Par Babas007 dans le forum Services Web
    Réponses: 0
    Dernier message: 14/04/2011, 10h55
  3. problème de proxy lors d'un appel d'un web service
    Par marwa21 dans le forum Windows Phone
    Réponses: 1
    Dernier message: 10/03/2011, 14h23
  4. Erreur 404 lors de l'appel d'un web service
    Par niouma dans le forum Services Web
    Réponses: 1
    Dernier message: 03/05/2009, 01h36
  5. problème d'arguments lors de l'appelle d'un web service
    Par hammag dans le forum Services Web
    Réponses: 1
    Dernier message: 24/06/2008, 17h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo