Problème avec le passage des en-têtes SOAP à l'aide d'Apache CXF client
Je suis en train de mettre en œuvre un simple client pour un service web, le seul problème auquel je suis confronté avec le webservice est, il a un générique de point de terminaison: http://myserver3333.com:8080/ws/services
et la façon dont vous la recherche des services web est déployé via l'en-tête SOAP.
Ainsi, par exemple, si vous essayez de frapper le service vis SOAP UI,
- le point de terminaison je précise est:
http://myserver3333.com:8080/ws/services
- Dans les en-têtes SOAP j'spécifiques suivants:
SERVICE-NAME = MyAwesomeService
OPÉRATION-NOM = makeMeMoreAwesome
Alors, comment puis-je faire la même chose à l'aide d'apache cxf client?
Mon code actuel:
URL wsdlLocation = new URL("http://myserver3333.com:8080/ws/service");
MyAwesomeService service = new MyAwesomeService(wsdlLocation);
MyAwesomeServicePort port = service.getMyAwesomeServiceSOAPPort();
List<Header> headers = new ArrayList<Header>();
Header operationNameHeader = new Header(new QName("OPERATION-NAME"), "makeMeMoreAwesome",
new JAXBDataBinding(String.class));
Header serviceNameHeader = new Header(new QName("SERVICE-NAME"), "MyAwesomeService",
new JAXBDataBinding(String.class));
headers.add(operationNameHeader);
headers.add(serviceNameHeader);
BindingProvider bindingProvider = (BindingProvider)port;
bindingProvider.getRequestContext().put(Header.HEADER_LIST, headers);
MakeMeMoreAwesomeRequest request = new MakeMeMoreAwesomeRequest();
MakeMeMoreAwesomeResponse response = port.makeMeMoreAwesome(request);
System.out.println(response.getAck());
Mais lorsque je l'exécute, j'ai cette erreur:
Exception in thread "main" com.sun.xml.ws.wsdl.parser.InaccessibleWSDLException: 2 counts of InaccessibleWSDLException.
java.io.IOException: Server returned HTTP response code: 500 for URL: http://myserver3333.com:8080/ws/services
java.io.IOException: Server returned HTTP response code: 500 for URL: http://myserver3333.com:8080/ws/services?wsdl
Qui est correct, car il n'existe pas de fichier WSDL à cet endroit, il faut suivre l'en-tête soap pour obtenir le service.
Mise à jour:
Après deux points de @Daniel Kulp je suis ici:
- J'ai ajouté une nouvelle ligne:
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://myserver3333.com:8080/ws/services");
Et maintenant j'ai cette erreur:
org.apache.cxf.binding.soap.SoapFault: "http://www.myserver.com/ws/services", the namespace on the "errorMessage" element, is not a valid SOAP version.
at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.readVersion(ReadHeadersInterceptor.java:115)
at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:141)
at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:60)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:771)
Mon hypothèse est que cette erreur est la même que cette un. Mais je ne suis pas à l'aide ?wsdl. Ainsi, des suggestions?
Vous devez vous connecter pour publier un commentaire.
2 commentaires:
1) Vous n'êtes pas ramasser CXF. Vérifiez votre classpath pour s'assurer CXF est là et pas dans le Sun/Oracle mise en œuvre. com.soleil.xml.ws.wsdl.analyseur.InaccessibleWSDLException montre vous sont ramasser le Soleil de la mise en œuvre.
2) L'URL passée en MyAwesomeService(wsdlLocation) DOIT être une URL du WSDL, pas le point de terminaison de lui-même.
import javax.xml.ws.BindingProvider
je reçois cet avertissement: restriction d'Accès: Le type BindingProvider n'est pas accessible à cause des restrictions sur la bibliothèque C:\Program Files (x86)\Java\jre6\lib\rt.jar. C'est seulement un avertissement, mais pourquoi suis-je cela? Quelle est l'alternative?