【发布时间】:2020-08-11 15:38:56
【问题描述】:
我有一个嵌入实体,它的字段类型为 Map
地图的所有键都是字符串类型。
下面是实体
@Entity
@Index
@Getter @Setter
public class NiftySurveys {
@Id
private Long id;
private List<SurveyQuestions> questions;
private Long createddate;
private Long updatedDate;
}
@Getter @Setter
public class SurveyQuestions {
private String label;
private String code;
private SurveyQuestionGroups questionGroup;
private Map<String,Object> optionGroup;
}
我无法使用 optionGroup 保存实体。
从前端提交的示例实体
{
"questions": [{
"label": "jio",
"code": null,
"questionGroup": {
"name": "Date Time",
"value": "DATI"
},
"optionGroup": {
"labels": [{
"label": "Date / Time"
}],
"collectDateInfo": true,
"collectTimeInfo": true,
"dateFormat": "MM/DD/YYYY",
"validationMessage": "Please Enter a Valid Date!"
}
}, {
"code": null,
"label": "Q2",
"questionGroup": {
"name": "Multiple Choice Questions",
"value": "MCQ"
},
"optionGroup": {
"name": "Agree - Disagree",
"code": "AGDAG",
"options": [{
"label": "YES",
"value": "Y"
}, {
"label": "NO",
"value": "N"
}]
}
}]
}
地图的所有键都是字符串。
错误信息:
exception: "com.googlecode.objectify.SaveException"
message: "Error saving com.nifty.niftyfeedbacks.domain.NiftySurveys@4ac88d5e: java.lang.IllegalStateException: Embedded Map keys must be of type String/Enum/Key<?> or field must specify @Stringify"
链接到堆栈跟踪 https://drive.google.com/file/d/1fqpPLiJutWLif5GnrlqLEZ6Wr_PdLdC-/view?usp=sharing
【问题讨论】:
-
这看起来应该没问题。什么是完整的堆栈跟踪?一般来说,最好在没有 java 序列化的情况下对对象图进行建模,如果可以的话。将来您将无法从 python 或其他语言读取@Serialized 数据。
-
我已经更新了问题并添加了完整的堆栈跟踪。
-
看起来地图内部列表中的内部地图导致了问题。你没有提到这是v5还是v6;如果是 v6,它可能使用 v6,我不确定。 Objectify 对
Object的作用有很大的限制,这是您的地图上限值的类型。 @Serialize 是正确的答案。或者,如果您想要更便携的东西,您可以将原生字段设为私有字符串,并在生命周期方法中将其序列化/反序列化为 JSON。
标签: java google-cloud-datastore objectify