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
相关产品推荐
相关产品推荐

