Bonjour,
j'utilise jax-rs pour le développement de web services avec REST de manière assez commune.
Conf spring :
Puis dans mon web service (classe OrgImpl.java) :
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>
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.
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)
Après une recherche j'ai mis en place des intercepteurs dans spring :
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 <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>
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).
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) { } }
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é
Partager