java - 作为 Web 服务的 SPI 提供程序嵌入的 Jetty 不会向客户端发送 Web 错误

标签 java jetty jax-ws fault service-provider

我正在开发一个项目,其中有一个嵌入式 jetty 服务器用于提供 html 管理页面,并且我需要集成一些 Web 服务。我使用 jax-ws 和 javax xml 注释来构建这些服务,并使用 jetty SPI 实现 (jetty-jaxws2-spi) 来替换默认的 HttpServerProvider:

...
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);
...

Web 服务工作正常,但是当我抛出 webfault 异常时,客户端仅获得 HTTP 200 结果代码,没有正文内容。 我将 httpserverprovider 切换回默认实现,并且错误已正确发送到客户端。

我认为 jetty-jaxws2-spi 实现中缺少某些内容,但不知道是什么。

有什么想法吗?

更新: 看来是JAVA版本和JAX库之间的兼容性问题。

在认可的目录中使用 java7 和 jaxb-api 和 jaxb-impl (2.1.12) 我得到:

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

并导致默认的 http 响应 (200)...

更新2

当我从我认可的目录中删除 jaxb-impl 和 jaxb-api 时,我的 webfault 工作正常。 但如果我这样做,我无法从 Jersey 获得自然 JSON 表示法,需要 jaxb 2.1.12。 该死的...

最佳答案

已解决:

在我认可的目录中添加 JAX-WS RI 2.1.7 和 JAXB 2.1.12 jar。

关于java - 作为 Web 服务的 SPI 提供程序嵌入的 Jetty 不会向客户端发送 Web 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9391804/

相关文章:

java - 如何在 jetty 上正确部署 Jenkins ?

java - 未填写所有 Spring 表单字段并收到错误请求错误 400

java - 如何使用 Java API 添加 SCRAM-SHA-512 kafka 配置?

java - Spring Mongotemplate从多个集合中获取数据

Jetty 8.1 用 "Dispatched Failed"消息淹没日志文件

java - 来自 Jetty 的 EofException

java - Web 服务跨语言参数类型

java - 如何在 JAX-WS 处理程序中区分请求和响应?

java - 通用 Spring Data JPA 存储库 findAll

web-services - 通过相同的 JAX-WS 服务同时支持 SOAP 1.1 和 1.2