首页 > 解决方案 > 为什么 OpenAPI 生成的 Spring 服务器无法解析带有兄弟元素的未包装 XML 数组?

问题描述

我在我的 Spring Boot 项目中使用 OpenAPI,并且我有以下部分规范供 OpenAPI 解析一些 XML 数据,包括一个未包装的数组,它是 element KYCInfo

CallbackRequestData:
  type: object
  xml:
    namespace: '<some_namespace>'
  properties:
    TransID:
      type: string
    TransTime:
      type: string
    TransAmount:
      type: number
      format: double
    ...
    KYCInfo:
      type: array
      xml:
        wrapped: false
      items:
        type: object
        required:
          - KYCName
          - KYCValue
        properties:
          KYCName:
            type: string
          KYCValue:
            type: string

要解析的XML如下:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:C2BPaymentValidationRequest xmlns:ns1="http://cps.huawei.com/cpsinterface/c2bpayment">
            <TransID>ABCDEFGIJKL</TransID>
            <TransTime>20210926113918</TransTime>
            ...
            <TransAmount>1.00</TransAmount>
            <KYCInfo>
                <KYCName>[Personal Details][First Name]</KYCName>
                <KYCValue>John</KYCValue>
            </KYCInfo>
            <KYCInfo>
                <KYCName>[Personal Details][Last Name]</KYCName>
                <KYCValue>Doe</KYCValue>
            </KYCInfo>
        </ns1:C2BPaymentValidationRequest>
    </soapenv:Body>
</soapenv:Envelope>

我已经使用openapi-generator-maven-pluginv5.2.1 为 Spring Boot 生成了 API 接口。我的问题是,当我将上面的 XML 发送到上面生成的 API 时,出现以下错误,显示 XML 映射器无法将 XML 数组转换为 POJO:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `CallbackRequestDataKYCInfo` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('[Personal Details][First Name]'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `CallbackRequestDataKYCInfo` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('[Personal Details][First Name]')
 at [Source: (PushbackInputStream); line: 14, column: 44] (through reference chain: C2bValidationRequest["Body"]->C2bValidationRequestBody["C2BPaymentValidationRequest"]->C2BCallbackRequestData["KYCInfo"]->java.util.ArrayList[0])]

注意:完整的包名称已被删除。是否有任何原因它失败或我错过了什么?请注意,我无法控制 XML,正在使用远程 3rd-party API。

标签: spring-bootopenapiopenapi-generator

解决方案


推荐阅读