我在使用 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>
)
你知道这是否可能吗?我应该创建自己的构造函数来处理这个问题吗?
谢谢
TL;DR:这是行不通的。 使用适当的库对数据进行序列化(反序列化) 到对象(例如 Jackson 也可以直接从/到 JSON)
您可以从
Map
前往 T
,但无法从 List<Map>
前往
List<T>
带有强制和 MapConstructor
。
目标类型是
List
(看看为什么不多
Java 中泛型中的擦除概念是什么?)。
输入是列表式的……足够好了,接受它。
如果没有
List
而只有 UtilisateurLightDto
就可以了,
因为 Groovy 会将映射对象强制转换为所需的对象。
这是你能得到的最好的。
使用
@MapConstructor
的另一个问题是它想要使用每个键
地图的,所以它会抛出,如果你的地图有更多/其他键,那就是
不是