RESTEASY003145:无法找到内容类型应用程序/xml 的 MessageBodyReader

问题描述

我正在尝试创建一个首次 Quarkus 项目。在这个项目中,我需要从另一个包中导入一个 Jax-rs 服务接口,并在客户端中使用它来调用服务。因此,我使用的是 RestClientBuilder,而不是基于 @RegisterRestClient 的方法,因为我无法控制 JaxRS 接口。

RestClientBuilder.newBuilder()
            .baseUri(URI.create("https://myexcelentserver"))
            .register(new BasicAuthentication("nonono","badbad"))
            .sslContext(getSSLContext(certPath.orElse(null))) //Handling self-signed cert
            .build(ConfigurationService.class);

以及依赖项(除其他外)

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-jaxb</artifactId>
</dependency>
<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-resteasy-jaxb</artifactId>
</dependency>
<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-rest-client-jaxb</artifactId>
</dependency>

但是我最终得到了例外

javax.ws.rs.ProcessingException:RESTEASY003145:无法找到 内容类型应用程序/xml 和类型类的 MessageBodyReader eu.sos.cicso.configservice.api.model.agent.Agent

这不是预期的结果,所以我尝试了以下方法

RestClientBuilder.newBuilder()
            .baseUri(URI.create("https://myexcelentserver"))
            .register(new BasicAuthentication("nonono","badbad"))
             .register(new LoggingFilter())
             .register(new JAXBXmlRootElementProvider())
            .sslContext(getSSLContext(certPath.orElse(null)))
            .build(ConfigurationService.class);

添加日志过滤器和 org.jboss.resteasy.plugins.providers.jaxb.JAXBXmlRootElementProvider。错误现在是

org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException: RESTEASY006510:找不到媒体类型的 JAXBContextFinder: 应用程序/xml

通过日志过滤器,我可以看到输出是预期的有效 XML。我还在 CXF 代理客户端中使用了 ConfigurationService 接口,完全出于绝望,并且没有问题。我也尝试过(以另一种绝望的方式)使用 CXF JaxB 提供程序,但 Quarkus 似乎不喜欢所有额外的依赖项,并且应用程序甚至没有启动。

那我做错了什么?似乎我在某处错误配置了某些东西,但我完全不知道是什么。

解决方法

嗯,最后结果很明显。似乎 RestClientBuilder 几乎没有做任何事情来自动发现类路径中的类。我通过简单地注册丢失的类来解决这个问题,幸运的是它与 ElementProvider 隐藏在同一个 jar 中。

RestClientBuilder.newBuilder()
            .baseUri(URI.create(hostName))
             .register(new LoggingFilter())
             .register(new JAXBXmlRootElementProvider())
             .register(new XmlJAXBContextFinder())
            .build(ConfigurationService.class);