Bonjour à tous,

Je souhaite invoquer des web services au sein d'une application web que je développe en Java 1.7 sous Eclipse. J'ai actuellement deux web services mais à terme, d'autres appels à d'autres web services vont venir se greffer à mon application. Pour mon premier web service, je suis allé au plus simple avec :
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
 
/** Dispatch utilisé pour les appels aux web services. */
Dispatch dispatch = null;
 
/**
 * Méthode d'initialisation des structures pour l'appel au web service
 */
public void init() {	
	QName serviceQName = new QName(targetNamespace, serviceName);
		QName portQName = new QName(targetNamespace, portName);
		Service service = Service.create(serviceQName);
		service.addPort(portQName, SOAPBinding.SOAP11HTTP_BINDING, endPoint);
	dispatch = service.createDispatch(portQName, SOAPMessage.class, Service.Mode.MESSAGE);
}
 
/**
 * Appel au web service.
 */
public void appelWebService1() {
	if (dispatch == null)
		init();
 
	// Création d'une requête SOAP
	MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
	soapMessage = mf.createMessage();
	SOAPPart part = soapMessage.getSOAPPart();
	SOAPEnvelope env = part.getEnvelope();
	SOAPBody body = env.getBody();
 
	// Construction du contenu du message
	SOAPElement operation = body.addChildElement(..., ...);
	...
	soapMessage.saveChanges();
 
	// Invocation du web service
	SOAPMessage soapResponse = dispatch.invoke(soapMessage);
 
	// Interprétation de la réponse
	// Par souci de simplicité, je ne détaillerai pas cette partie-là car elle fonctionne et ce n'est pas le problème
}
Remarque très importante : pour cet appel au web service #1, je n'ai pas utilisé d'outil tel que wsimport : je manipule des SOAPElement et je décode la réponse avec les structures de org.w3c.dom. Cela fonctionne parfaitement en l'état, et je trouve que c'est beaucoup plus propre que de travailler avec des classes auto-générées incompréhensibles.

Mon problème est le suivant : je souhaite appeler un web service #2, mais qui contrairement au web service #1, doit être appelé au travers d'un proxy. J'ai passé plusieurs heures à chercher des solutions sur le net pour configurer un proxy pour mon appel au web service #2, et la solution qui me paraît la plus adaptée à mon cas est d'utiliser un BindingProvider en ajoutant les lignes suivantes dans ma méthode init(), au moment de créer mon objet dispatch :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
?????? port = service.getPort(??????.class);
Map<String, Object> bindingConfiguration = ((BindingProvider) port).getRequestContext();
bindingConfiguration.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, proxyAddress);
bindingConfiguration.put(BindingProvider.USERNAME_PROPERTY, proxyUser);
bindingConfiguration.put(BindingProvider.PASSWORD_PROPERTY, proxyPassword);
Et c'est là que je bloque : quoi mettre à la place des ??????
Tous les exemples que j'ai trouvés sur le net utilisent une des classes auto-générées par wsimport or je ne souhaite surtout pas passer par des classes auto-générées (encore une fois, je n'ai pas eu besoin de wsimport pour appeler mon web service #1, appeler le web service #2 ne justifie pas de générer 15 000 classes pour le seul motif que le web service #2 passe par un proxy). Sauriez-vous comment contourner ce problème ?
Si jamais il existait une autre manière de configurer mon proxy que par un BindingProvider comme indiqué ci-dessus, j'en suis preneur.

À noter qu'il n'est pas envisageable d'utiliser les propriétés système pour configurer le proxy car seul le web service #2 passe par un proxy (et d'ailleurs, rien ne me dit que pour les web services à venir je ne passerai pas par un autre proxy).

Merci d'avance pour votre aide.