web-dev-qa-db-fra.com

Erreur du service Web Java: com.ctc.wstx.exc.WstxEOFException: inattendue EOF en prologue

J'ai un problème pour créer et connecter un client Java à un service Web en cours d'exécution.

J'utilise le code suivant:

Service myService  = null;
URL wsdlLocation = new URL("http://myservice?wsdl");
QName serviceName = new QName(wsdlLocation, "MyService");
Service myService = new Service(wsdlLocation, serviceName);

où la classe Service a été créée avec la commande suivante:

wsimport -d gen -keep http://myservice?wsdl

J'ai également essayé avec un client généré par wsdl2Java d'Apache cxf 2.4, mais j'ai obtenu le même résultat.

(J'ai modifié l'emplacement du WSDL et le nom de la classe de service uniquement pour ce message, dans le code que j'ai utilisé pour les originaux.)

Mais je reçois une exception lorsque j'appelle le service Web déployé sur le serveur d'applications, lors de la création du service avec la nouvelle commande Service () . Mais: j'ai testé l'emplacement wsdl avec l'interface utilisateur SOAP et cela fonctionne parfaitement . En outre, j'ai créé un service fictif à l'aide de Soap UI et mon client Java pouvait s'y connecter, l'appeler et obtenir les résultats en retour . Le problème apparaît lorsque je souhaite appeler le service Web en cours d'exécution sur le serveur d'applications.

Trace de la pile:

javax.xml.ws.WebServiceException: org.Apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
        at org.Apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.Java:149)
        at org.Apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.Java:98)
        at javax.xml.ws.Service.<init>(Service.Java:76)
        at MyService.<init>(MyService.Java:42)
        at mypackage.createService(AClass.Java:288)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:616)
Caused by: org.Apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
        at org.Apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.Java:100)
        at org.Apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.Java:199)
        at org.Apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.Java:147)
        ... 12 more
Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
 at [row,col,system-id]: [1,0,"http://myservice?wsdl"]
        at org.Apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.Java:256)
        at org.Apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.Java:205)
        at org.Apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.Java:98)
        ... 14 more
Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
 at [row,col,system-id]: [1,0,"http://myservice?wsdl"]
        at com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.Java:677)
        at com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.Java:2139)
        at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.Java:2045)
        at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.Java:1134)
        at org.Apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.Java:1248)
        at org.Apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.Java:1142)
        at org.Apache.cxf.staxutils.StaxUtils.read(StaxUtils.Java:1069)
        at org.Apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.Java:247)
        ... 16 more

Quelqu'un pourrait-il m'aider s'il vous plaît?

8
Kumite

Je me souviens avoir lu que cela pourrait être lié au point final qui attend un «/» final. Je ne sais pas si cela est valable, mais essayez-le et signalez-le ici si cela fonctionne.

3
Somaiah Kumbera

J'ai eu une erreur similaire et quand j'ai vérifié les journaux du serveur - c'était lié au serveur http qui avait rencontré une méthode http non supportée dans la requête. En raison de cela, le serveur renvoie une réponse HTTP que le client SOAP ne peut pas gérer ... donc inattendu EOF dans prolog Voici un extrait du journal de mon serveur Web pour Tomcat "localhost.XXXX. bûche"

org.Apache.Tomcat.util.descriptor.web.SecurityConstraint.findUncoveredHttpMethods For security constraints with URL pattern [/services/*] only the HTTP methods [POST GET] are covered. All other methods are uncovered.

Cela a donné l'erreur suivante du côté client 

 com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog

Dans mon cas, étant donné que je rétrogradais un service sécurisé sur non sécurisé et que mon fichier web.xml comportait une entrée parasite suivante qui restreignait GET et post avec une contrainte de sécurité et que je n'envoyais pas les paramètres de sécurité requis dans la demande.

<security-constraint>
    <web-resource-collection>
      <web-resource-name>restricted web services</web-resource-name>
          <url-pattern>/services/*</url-pattern>
          <http-method>GET</http-method>
          <http-method>POST</http-method>
        </web-resource-collection>

J'ai enlevé cette contrainte pour se débarrasser de cette erreur :-) 

Dans votre cas, cela peut ne pas être lié à une contrainte de sécurité - mais bien à un envoi de réponse http brute par le serveur - Vérifiez la configuration de votre serveur/client et assurez-vous qu'il envoie la requête http appropriée appréciée par le serveur http.

2
Yogesh Devi

J'ai eu une erreur similaire et lorsque j'ai vérifié les journaux du serveur - cela était lié au fait que le serveur http avait rencontré une méthode http non prise en charge dans une requête renvoyait une réponse HTTP que le client SOAP ne pouvait pas gérer. 

1
user3197665

J'ai eu un problème similaire et j'ai résolu avec le débogage . Lorsque j'essaie de télécharger WSDL au runtime, j'ai constaté que je ne pouvais pas obtenir le WSDL à cause du proxy . Veuillez vérifier que vous pouvez accéder au WSDL au runtime comme ce code:

  try {
      String wsdl = IOUtils.toString(new URL("http://YOUR_WSDL_URL"));
      System.out.println("WSDL => "+wsdl);
  } catch (IOException e) {
         e.printStackTrace();
  }
1
kkurt

J'ai rencontré cette erreur et j'ai constaté que cela semblait dû à l'utilisation d'une URL qui renvoyait directement une redirection HTTP 302 au lieu du WSDL. 

L'URL que j'utilisais était au format /Service?wsdl, qui a été redirigé vers une URL au format /Service/wsdl/Service.wsdl. Une fois que j'ai utilisé directement l'URL cible de la redirection, tout a fonctionné.

1
Michael R

Une des importations est manquante. S'il vous plaît vérifier les routes vers votre xsd.

J'ai eu le même problème. J'ai dû utiliser le chemin complet du fichier WSDL pour que cela fonctionne.

0
Daryl Le

Cela n’est sûrement pas dû à un problème de caractère ou de format ..__ Il est possible que le serveur n’ait renvoyé aucune donnée dont Woodstox (wstx) essayait de s’analyser en XML et avait échoué, ce qui a entraîné cette erreur.

0
Julio D