OpenAPI生成的Spring服务为何无法解析带同级元素的未包裹XML数组
问题成因
- openapi-generator-maven-plugin v5.2.1版本的Spring代码生成器默认未开启XML注解生成逻辑,生成的POJO不会自动添加Jackson XML解析所需的序列化/反序列化注解,无法正确识别XML节点结构。
- OpenAPI定义中配置的
xml.wrapped = false未被正确映射为Jackson的@JacksonXmlElementWrapper(useWrapping = false)注解,导致Jackson XML解析器默认按包裹数组规则解析内容,把节点下第一个子节点 的文本值误判为整个KYCInfo实例的构造入参,触发找不到字符串参数构造方法的报错。 - 生成的
CallbackRequestDataKYCInfo类缺少@JacksonXmlRootElement(localName = "KYCInfo")注解,解析器无法将独立的节点识别为该类的实例。 - 若请求头未携带正确的
Content-Type: application/xml,Spring会优先使用JSON消息转换器解析XML内容,也会触发类型不匹配错误。
修复方案
1. 调整openapi-generator插件配置
在pom.xml的openapi-generator-maven-plugin配置节点下开启XML注解生成:
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>5.2.1</version> <configuration> <generatorName>spring</generatorName> <additionalProperties> <!-- 开启XML注解生成 --> <xmlAnnotations>true</xmlAnnotations> <!-- 其余原有配置保持不变 --> </additionalProperties> <!-- 其余原有配置保持不变 --> </configuration> </plugin>
重新执行代码生成,插件会自动为POJO添加Jackson XML相关注解。
2. 补全OpenAPI XML字段配置(适配旧版本插件映射缺陷)
如果开启XML注解生成后仍未正确生成未包裹数组的对应注解,可以显式指定数组和元素的XML节点名:
KYCInfo: type: array xml: wrapped: false name: KYCInfo items: type: object xml: name: KYCInfo required: - KYCName - KYCValue properties: KYCName: type: string KYCValue: type: string
3. 确认XML解析依赖引入
Spring Boot项目需要引入Jackson XML解析模块:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
4. 校验请求头
调用接口时需携带请求头Content-Type: application/xml,确保Spring使用XML消息转换器处理请求内容。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

