RESTEASY003145 : Unable to find a MessageBodyReader of content-type application/xml

标签 resteasy quarkus quarkus-rest-client

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

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>

但是我最终遇到了异常(exception)

javax.ws.rs.ProcessingException: RESTEASY003145: Unable to find a MessageBodyReader of content-type application/xml and type class 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: Could not find JAXBContextFinder for media type: application/xml

通过日志过滤器,我可以看到输出是符合预期的有效 XML。出于纯粹的无奈,我还在 CXF 代理客户端中使用了 ConfigurationService 接口(interface),并且工作没有问题。我还尝试(在另一种绝望的情况下)使用 CXF JaxB 提供程序,但 Quarkus 似乎不喜欢引入所有额外的依赖项,并且应用程序甚至没有启动。

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

最佳答案

好吧,最终结果是非常明显的。看起来 RestClientBuilder 在自动发现类路径中的类方面几乎没有做任何事情(如果有的话)。我通过简单地注册缺少的类解决了这个问题,幸运的是,该类与 ElementProvider 隐藏在同一个 jar 中。

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

关于RESTEASY003145 : Unable to find a MessageBodyReader of content-type application/xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68113973/

相关文章:

java - 如何覆盖 JAX-RS 内容协商期间所做的决定?

java - Jboss RestEasy应用程序中的@Autowired空指针异常

java - 当我将quarkus适配到一个简单的spring boot项目时出现“No Spring WebApplicationInitializer types detected on classpath”?

java - 带代理配置的 Quarkus/Restclient

java - 创建 kubernetes 部署时,Quarkus RestClient 属性的环境值无效

java - NoMessageBodyWriterFoundFailure : Could not find MessageBodyWriter for response object of type

jakarta-ee - 使用 jax-rs/resteasy 进行 Bean 验证(jsr 303)

java - 使用 Flyway 在 Quarkus 上进行响应式 hibernate

jackson - Quarkus Jackson InvalidDefinitionException 无法找到类型 [简单类型,类 java.math.BigDecimal] 的(映射)键反序列化器

interceptor - 在 Quarkus 中,有没有办法在 REST 客户端调用上应用响应拦截器?