Je jetée intégrée en tant que fournisseur SPI pour le service Web n'envoie pas WebFault au client
-
29-10-2019 - |
Question
Je travaille sur un projet où j'ai un serveur de jetée intégré pour servir des pages d'administration HTML et j'ai besoin d'intégrer certains services Web. J'utilise les annotations JAX-WS et Javax XML pour créer des services de théâtre et utiliser l'implémentation SPI de Jetty (Jetty-Jaxws2-SPI) pour remplacer HttpServerProvider par défaut:
...
System.setProperty("com.sun.net.httpserver.HttpServerProvider","org.eclipse.jetty.jaxws2spi.JettyHttpServerProvider");
HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(serverPort),0);
...
HttpContext httpContext = httpsServer.createContext("/ws/myservice");
Endpoint endpoint = Endpoint.create(new AuthenticateImpl());
endpoint.publish(httpContext);
...
Le service Web fonctionne correctement, mais lorsque je lève une exception Webfault, le client n'obtient que le code de résultat HTTP 200 sans contenu corporel. Je révise le HTTPServerProvider à l'implémentation par défaut, et le défaut est envoyé correctement au client.
Je pense que quelque chose manque dans la mise en œuvre de Jetty-Jaxws2-SPI, mais je ne sais pas quoi.
une idée ?
mettre à jour: Cela semble être un problème de compatibilité entre Java Version et Jax Libs.
Avec Java7 et Jaxb-API et Jaxb-Impl (2.1.12) dans DIR approuvé, je reçois:
java.lang.ExceptionInInitializerError
at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:254)
at com.sun.xml.internal.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:85)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:626)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:585)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:570)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:467)
at com.sun.xml.internal.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:299)
at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:593)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(WSHttpHandler.java:95)
at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(WSHttpHandler.java:80)
at org.eclipse.jetty.jaxws2spi.JAXWS2ContextHandler.doScope(JAXWS2ContextHandler.java:75)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:247)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
at org.eclipse.jetty.server.Server.handle(Server.java:346)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:589)
at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1065)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:823)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:214)
at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:411)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:535)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:529)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.internal.bind.api.JAXBRIContext
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.<clinit>(SOAPFaultBuilder.java:550)
... 25 more
et conduire à une réponse HTTP par défaut (200) ...
MISE À JOUR 2
Je fais fonctionner Webfault lorsque je supprime JAXB-IMPL et JAXB-API de mon répertoire approuvé. Mais si je fais cela, je ne peux pas obtenir la notation JSON naturelle de Jersey, JAXB 2.1.12 requis. Zut ...
La solution
Résolu:
Ajoutez JAX-WS RI 2.1.7 et JAXB 2.1.12 pots dans mon Dir approuvé.