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

使用SimpleFramework解析XML到Kotlin/Java 报Publication构造函数匹配错误

问题原因
  1. 构造函数匹配失败:Kotlin的@JvmOverloads注解仅会为携带默认值的参数生成重载构造,你的原Publication类中authors参数未设置默认值,同时OpenaireModel类的header字段未添加序列化注解,导致SimpleFramework无法找到可用的构造函数初始化实例。
  2. 列表注解配置错误:标记了inline=true的ElementList不需要配置entry属性,多余的配置会导致框架无法正确映射同级重复节点到列表字段。
  3. 不必要的类型封装:doi、sourcejournal、webresource均为纯文本内容的重复节点,无需额外定义类包裹,多余的嵌套类会进一步提升构造匹配的复杂度。
解决方案

按照以下步骤修正实体类即可:

  1. 为所有构造参数添加默认值,确保@JvmOverloads能生成框架需要的无参构造
  2. 移除ElementList中多余的entry配置,删除不必要的Doi、Sourcejournal、Webresource包裹类,直接使用List<String>接收文本列表
  3. 补全缺失的字段序列化注解

修正后的核心代码如下:

@Root(name = "response", strict = false)
class OpenaireModel @JvmOverloads constructor(
    @field:Element(name = "header")
    var header: Header? = null,

    @field:Element(name = "publications")
    var publications: Publications? = null,
)

@Root(name = "header", strict = false)
class Header @JvmOverloads constructor(
    @field:Element(name = "size")
    var size: Int? = null,
    @field:Element(name = "page")
    var page: Int? = null,
    @field:Element(name = "total")
    var total: Int? = null
)

@Root(name = "authors", strict = false)
class Authors @JvmOverloads constructor(
    @field:ElementList(inline = true, required = false)
    var author: List<String> = emptyList()
)

@Root(name = "publication", strict = false)
class Publication @JvmOverloads constructor(
    @field:Element(name = "openaireid")
    var openaireid: String? = null,

    @field:ElementList(
        required = false,
        name = "doi",
        inline = true,
        empty = true
    )
    var dois: List<String> = emptyList(),

    @field:Element(name = "description", required = false)
    var description: String? = null,

    @field:Element(name = "publicationtype")
    var publicationtype: String? = null,

    @field:Element(name = "title")
    var title: String? = null,

    @field:Element(name = "authors", required = false)
    var authors: Authors? = null,

    @field:ElementList(
        required = false,
        name = "sourcejournal",
        inline = true,
        empty = true
    )
    var sources: List<String> = emptyList(),

    @field:Element(name = "dateofacceptance")
    var dateofacceptance: String? = null,

    @field:ElementList(
        required = false,
        name = "webresource",
        inline = true,
        empty = true
    )
    var resources: List<String> = emptyList(),

    @field:Element(name = "bestlicense")
    var bestlicense: String? = null
)

@Root(name = "publications", strict = false)
class Publications @JvmOverloads constructor(
    @field:ElementList(inline = true, required = false)
    var publication: List<Publication> = emptyList()
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:57:01