Groovy MapConstructor 未使用正确的类型实例化子列表

问题描述 投票:0回答:1

我在使用 groovy 给出的 @MapConstructor 时遇到问题。

考虑到这种有效负载体

// @no-cookie-jar
// @no-log
POST {{host}}/api/collection?logon={{logon}}&key={{key}}
Content-Type: application/json

{
  "libelle": "{{$random.alphanumeric(25)}}",
  "collaborators": [{ "utilisateur": 1001 }, { "utilisateur": 1003 }]
}

在我的代码库中的某个通用类中像这样处理:

def payload = new JsonSlurper(type: JsonParserType.INDEX_OVERLAY).parse(body, "UTF-8")
// dtoKlass is CollectionDto
def dto = dtoKlass.newInstance(payload) as DTO

这是 2 个 POJO

@MapConstructor
class UtilisateurLightDto {
    long utilisateur
}

@MapConstructor
class CollectionDto {
    long collection
    String libelle

    List<UtilisateurLightDto> collaborators = []
}

一切都很棒,直到我将

collaborators
字段添加到
CollectionDto
。当返回
newInstance
的结果对象时,
collaborators
未按预期键入(即:
List<UtilisateurLightDto>
enter image description here

你知道这是否可能吗?我应该创建自己的构造函数来处理这个问题吗?

谢谢

arrays groovy constructor annotations
1个回答
0
投票

TL;DR:这是行不通的。 使用适当的库对数据进行序列化(反序列化) 到对象(例如 Jackson 也可以直接从/到 JSON)

您可以从

Map
前往
T
,但无法从
List<Map>
前往
List<T>
带有强制和
MapConstructor

目标类型是

List
(看看为什么不多 Java 中泛型中的擦除概念是什么?)。 输入是列表式的……足够好了,接受它。

如果没有

List
而只有
UtilisateurLightDto
就可以了, 因为 Groovy 会将映射对象强制转换为所需的对象。 这是你能得到的最好的。

使用

@MapConstructor
的另一个问题是它想要使用每个键 地图的,所以它会抛出,如果你的地图有更多/其他键,那就是 不是

© www.soinside.com 2019 - 2024. All rights reserved.