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:
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:
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:
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:
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é :)