You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus REST Client发送XML时子元素被转小写导致无效问题

解决Quarkus Rest Client XML序列化修改元素名的问题

问题根源

Quarkus默认的REST Client XML序列化组件是Jackson XML模块,它不会自动识别JAXB注解,而是采用默认命名策略将Java属性名转为小写(比如getContracts生成getContracts、FooContracts生成fooContracts),导致生成的XML不符合目标API的格式要求。

解决方案

1. 切换到JAXB进行XML序列化

在pom.xml中添加Quarkus JAXB扩展,同时排除Jackson XML的默认依赖(若存在):

<!-- 添加Quarkus JAXB扩展 -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-jaxb</artifactId>
</dependency>

<!-- 排除Jackson XML依赖(如果引入了quarkus-rest-client-jackson) -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-rest-client-jackson</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 为Rest Client注册JAXB消息体提供者

修改ApiService接口,添加JAXB的序列化/反序列化提供者:

import org.jboss.resteasy.plugins.providers.jaxb.JAXBElementProvider;
import org.jboss.resteasy.plugins.providers.jaxb.JaxbMarshallerProvider;

@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
@RegisterProviders({
        ResponseExceptionHandler.class,
        RequestFilter.class,
        ResponseFilter.class,
        // 注册JAXB相关提供者
        JAXBElementProvider.class,
        JaxbMarshallerProvider.class
})
@RegisterClientHeaders(ApiHeaderHandler.class)
@RestClient
public interface ApiService {

    @POST
    @Path("/Order")
    Object orderRequest(OrderRequest orderRequest);
}

3. 手动构建客户端时指定JAXB提供者(可选)

如果通过RestClientBuilder手动创建客户端实例,需显式注册JAXB提供者:

ApiService apiService = RestClientBuilder.newBuilder()
        .baseUri(URI.create(url))
        .connectTimeout(10, TimeUnit.SECONDS)
        .register(JAXBElementProvider.class)
        .register(JaxbMarshallerProvider.class)
        .build(ApiService.class);

4. 确认实体类注解有效性

确保实体类的JAXB注解配置正确:

  • OrderType类中@XmlElement(name = "GetContracts")的name属性与目标API要求的元素名完全匹配
  • 确认@XmlAccessorType(XmlAccessType.FIELD)注解生效,保证字段级别的注解被正确识别

验证

完成配置后重新调用接口,Rest Client会通过JAXB序列化XML,严格遵循你定义的注解生成元素名,目标API将不再返回XML无效的错误。

内容的提问来源于stack exchange,提问作者Bevor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:25:22