Quarkus 中的 SOAP Web 服务因未知的 JAXBContext 实现而失败
SOAP Webservice in Quarkus fails with Unknown JAXBContext implementation
我有一个 Quarkus 服务,我在启动时发布了一个 SOAP 服务,如下所示:
@WebService(serviceName = "/service", portName = "ServicePort")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@ApplicationScoped
public class Astute implements AstuteManager {
void onStart(@Observes StartupEvent ev) {
String url = "http://localhost:9005/";
Endpoint.publish(url, this);
}
@WebMethod(operationName = "Retrieve", action = "Retrieve")
@WebResult(name = "response", targetNamespace = "http://some.namepsace")
@RequestWrapper(localName = "RetrieveInfo", targetNamespace = "http://some.namepsace",
className = "dto.RetrieveDto")
@ResponseWrapper(localName = "RetrieveReply", targetNamespace = "http://some.namespace",
className = "dto.RetrieveReplyDto")
public RetrieveReplyDto retrieveClientPortfolio(
@WebParam(name = "request", targetNamespace = "http://some.namespace") RetrieveInfo request) {
//do something
}
当我到达那个终点时,我得到:
SEVERE [com.sun.xml.int.ws.tra.htt.HttpAdapter] (pool-4-thread-1) Unknown JAXBContext implementation:
class com.sun.xml.bind.v2.runtime.JAXBContextImpl: com.sun.xml.internal.ws.spi.db.DatabindingException:
Unknown JAXBContext implementation: class com.sun.xml.bind.v2.runtime.JAXBContextImpl
at com.sun.xml.internal.ws.spi.db.BindingContextFactory.getJAXBFactory(BindingContextFactory.java:192)
at com.sun.xml.internal.ws.spi.db.BindingContextFactory.create(BindingContextFactory.java:134)
at com.sun.xml.internal.ws.message.jaxb.JAXBMessage.create(JAXBMessage.java:152)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createSOAP11Fault(SOAPFaultBuilder.java:424)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createSOAPFaultMessage(SOAPFaultBuilder.java:201)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createSOAPFaultMessage(SOAPFaultBuilder.java:189)
at com.sun.xml.internal.ws.server.WSEndpointImpl.process(WSEndpointImpl.java:411)
at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:706)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:260)
at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(WSHttpHandler.java:98)
at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(WSHttpHandler.java:82)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:82)
at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:675)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我认为这可能是依赖冲突,但我的依赖树中没有任何突出的地方。
这是从 Quarkus 启动 SOAP 服务的正确方法吗?
以下是 pom 中的依赖项:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-core</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jaxb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-mssql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
Quarkus V1.2.0
我认为这可能是一个 class 加载问题,类似于我们过去在 JAXB 中看到的一些 classes 来自 JDK 本身而一些来自依赖项。
你可以试试:
- 升级到 1.3.0.Alpha1(使用 quarkus-bom
而不是 quarkus-universe-bom
)并升级 Quarkus Maven 插件版本
- 然后将以下依赖项添加到您的 pom.xml
:
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>rt</artifactId>
<version>2.3.1</version>
</dependency>
看看它是否能解决您的问题。
如果没有,请创建一个简单的复制器并在我们的 GitHub 上创建一个问题,以便我们仔细查看。
我有一个 Quarkus 服务,我在启动时发布了一个 SOAP 服务,如下所示:
@WebService(serviceName = "/service", portName = "ServicePort")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@ApplicationScoped
public class Astute implements AstuteManager {
void onStart(@Observes StartupEvent ev) {
String url = "http://localhost:9005/";
Endpoint.publish(url, this);
}
@WebMethod(operationName = "Retrieve", action = "Retrieve")
@WebResult(name = "response", targetNamespace = "http://some.namepsace")
@RequestWrapper(localName = "RetrieveInfo", targetNamespace = "http://some.namepsace",
className = "dto.RetrieveDto")
@ResponseWrapper(localName = "RetrieveReply", targetNamespace = "http://some.namespace",
className = "dto.RetrieveReplyDto")
public RetrieveReplyDto retrieveClientPortfolio(
@WebParam(name = "request", targetNamespace = "http://some.namespace") RetrieveInfo request) {
//do something
}
当我到达那个终点时,我得到:
SEVERE [com.sun.xml.int.ws.tra.htt.HttpAdapter] (pool-4-thread-1) Unknown JAXBContext implementation:
class com.sun.xml.bind.v2.runtime.JAXBContextImpl: com.sun.xml.internal.ws.spi.db.DatabindingException:
Unknown JAXBContext implementation: class com.sun.xml.bind.v2.runtime.JAXBContextImpl
at com.sun.xml.internal.ws.spi.db.BindingContextFactory.getJAXBFactory(BindingContextFactory.java:192)
at com.sun.xml.internal.ws.spi.db.BindingContextFactory.create(BindingContextFactory.java:134)
at com.sun.xml.internal.ws.message.jaxb.JAXBMessage.create(JAXBMessage.java:152)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createSOAP11Fault(SOAPFaultBuilder.java:424)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createSOAPFaultMessage(SOAPFaultBuilder.java:201)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createSOAPFaultMessage(SOAPFaultBuilder.java:189)
at com.sun.xml.internal.ws.server.WSEndpointImpl.process(WSEndpointImpl.java:411)
at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:706)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:260)
at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(WSHttpHandler.java:98)
at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(WSHttpHandler.java:82)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:82)
at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:675)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我认为这可能是依赖冲突,但我的依赖树中没有任何突出的地方。 这是从 Quarkus 启动 SOAP 服务的正确方法吗?
以下是 pom 中的依赖项:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-core</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jaxb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-mssql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
Quarkus V1.2.0
我认为这可能是一个 class 加载问题,类似于我们过去在 JAXB 中看到的一些 classes 来自 JDK 本身而一些来自依赖项。
你可以试试:
- 升级到 1.3.0.Alpha1(使用 quarkus-bom
而不是 quarkus-universe-bom
)并升级 Quarkus Maven 插件版本
- 然后将以下依赖项添加到您的 pom.xml
:
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>rt</artifactId>
<version>2.3.1</version>
</dependency>
看看它是否能解决您的问题。
如果没有,请创建一个简单的复制器并在我们的 GitHub 上创建一个问题,以便我们仔细查看。