【发布时间】:2020-11-15 20:04:50
【问题描述】:
我有一个 Quarkus 微服务,它公开了一个具有如下端点的 REST 接口:
...
@POST
@Consumes(value = MediaType.APPLICATION_XML)
public Response createMoneyTransferOrder(MoneyTransfer moneyTransfer);
...
MoneyTransfer 是一个 JAXB 对象:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MoneyTransfer",propOrder = {"sourceAccount", "targetAccount", "amount"})
public class MoneyTransfer
{
...
}
当使用有效的 MoneyTransfer 对象调用上述端点时,会引发以下异常:
2020-07-26 12:41:26,306 ERROR [org.apa.cam.pro.err.DefaultErrorHandler] (Camel (camel-1) thread #0 - file://src/main/resources/inbox)
Failed delivery for (MessageId: 1F4B4F8FC3E51AB-0000000000000005 on ExchangeId: 1F4B4F8FC3E51AB-0000000000000005). Exhausted after delivery attempt: 1 caught: org.apache.camel.InvalidPayloadException:
No body available of type: java.io.InputStream but has value: fr.simplex_software.eip.money_transfer.jaxb.MoneyTransfer@2bfa4bb4 of type: fr.simplex_software.eip.money_transfer.jaxb.MoneyTransfer on: money-xfer.xml.
Caused by: No type converter available to convert from type: fr.simplex_software.eip.money_transfer.jaxb.MoneyTransfer to the required type: java.io.InputStream with value fr.simplex_software.eip.money_transfer.jaxb.MoneyTransfer@2bfa4bb4. Exchange[1F4B4F8FC3E51AB-0000000000000005]. Caused by: [org.apache.camel.NoTypeConversionAvailableException -
No type converter available to convert from type: fr.simplex_software.eip.money_transfer.jaxb.MoneyTransfer to the required type: java.io.InputStream with value fr.simplex_software.eip.money_transfer.jaxb.MoneyTransfer@2bfa4bb4]
似乎发生的情况是 quarkus-resteasy 无法按照 thge JAX-RS 规范的要求将 MoneyTransfer 对象编组/解组到 XML,并且需要自定义转换器。但是,quarkus-resteasy 是 JAX-RS 规范的实现,明确要求对使用 @XmlType 注释的类进行自动编组/解组,因为这是我的情况。
有谁知道这里可能是什么问题?我想提一下,这种自动编组/解组功能自古以来就适用于 JBoss/Wildfly/Thorntail 上的 RESTeasy。最后但并非最不重要的一点是,REST 服务调用是由 Camel 3.3.0 (quarkus-camel-rest) 进行的,如果这个细节有什么不同的话。代码如下:
...
restConfiguration().host("localhost:8081/api")
.producerComponent("http").bindingMode(RestBindingMode.xml);
...
.to("http://localhost:8081/api?consumes=application/xml");
亲切的问候, 西摩
【问题讨论】:
-
您确定错误是由 RestEasy 引发的吗?骆驼似乎正在引发此错误。是否还添加了 camel-jaxb 依赖项?
-
我当然有camel-quarkus-jaxb。 Camel 在尝试执行端点 to("rest://...") 时会引发异常。 Camel“rest”组件应该简单地调用 javax.ws.rs.client,它应该执行所需的自动转换。那么,quarkus-resteasy 有可能不支持 javax.ws.rs.client,而不是 RESTeasy 吗?
标签: rest jaxb apache-camel jax-rs quarkus