使用SimpleFramework解析XML到Kotlin/Java 报Publication构造函数匹配错误
问题原因
- 构造函数匹配失败:Kotlin的
@JvmOverloads注解仅会为携带默认值的参数生成重载构造,你的原Publication类中authors参数未设置默认值,同时OpenaireModel类的header字段未添加序列化注解,导致SimpleFramework无法找到可用的构造函数初始化实例。 - 列表注解配置错误:标记了
inline=true的ElementList不需要配置entry属性,多余的配置会导致框架无法正确映射同级重复节点到列表字段。 - 不必要的类型封装:
doi、sourcejournal、webresource均为纯文本内容的重复节点,无需额外定义类包裹,多余的嵌套类会进一步提升构造匹配的复杂度。
解决方案
按照以下步骤修正实体类即可:
- 为所有构造参数添加默认值,确保
@JvmOverloads能生成框架需要的无参构造 - 移除
ElementList中多余的entry配置,删除不必要的Doi、Sourcejournal、Webresource包裹类,直接使用List<String>接收文本列表 - 补全缺失的字段序列化注解
修正后的核心代码如下:
@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
相关产品推荐
相关产品推荐

