【问题标题】:Quarkus 1.5.2.Final: quarkus-resteasy automatic JAXB marshalling/unmarshalling doesn't workQuarkus 1.5.2.Final:quarkus-resteasy 自动 JAXB 编组/解组不起作用
【发布时间】: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


【解决方案1】:

我正在回答我自己的问题。最后,由于某种原因,Camel“rest”端点似乎不支持从/到 Java 到/从 XML 的自动编组/解组。因此,我需要替换以下路线:

...
restConfiguration().host("localhost:8081/api").producerComponent("http").bindingMode(RestBindingMode.xml);
...
.to("rest://post:api")

作者:

...
//restConfiguration().host("localhost:8081/api").producerComponent("http").bindingMode(RestBindingMode.xml);
...
.bean("moneyTransferBean","sendMoney");

moneyTransferBean 如下所示:

@Singleton
@Named("moneyTransferBean")
public class MoneyTransferBean
{
  @Inject
  @RestClient
  private MoneyTransferResource moneyTransferResource;
  ...
  public void sendMoney(MoneyTransfer moneyTransfer)
  {
    moneyTransferResource.createMoneyTransferOrder(moneyTransfer);
  }
  ...
}

这样就可以按预期工作了。然而,我对无法使用 Camel 端点并不得不求助于这种黑客行为感到非常失望:-(

亲切的问候, 西摩

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2014-12-25
    • 1970-01-01
    • 2012-12-21
    • 2023-03-14
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多