Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用映射保存Objectify实体<;字符串,对象>;在嵌入式类中?_Java_Google Cloud Datastore_Objectify - Fatal编程技术网

Java 无法使用映射保存Objectify实体<;字符串,对象>;在嵌入式类中?

Java 无法使用映射保存Objectify实体<;字符串,对象>;在嵌入式类中?,java,google-cloud-datastore,objectify,Java,Google Cloud Datastore,Objectify,我有一个内嵌的实体,它有一个Map类型的字段 映射的所有键都是字符串类型 下面是实体 @Entity @Index @Getter @Setter public class NiftySurveys { @Id private Long id; private List<SurveyQuestions> questions; private Long createddate; private Long updatedDate; } @Gett

我有一个内嵌的实体,它有一个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;
}

地图的所有键都是字符串

错误消息:

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"
异常:“com.googlecode.objectify.SaveException” 消息:“保存com.nifty.niftyfeedbacks.domain时出错。NiftySurveys@4ac88d5e:java.lang.IllegalStateException:嵌入的映射键必须是String/Enum/Key类型,或者字段必须指定@Stringify“ 链接到堆栈跟踪
要了解@Stringify的工作原理,请查看:

您也可以通过一个好的JPA教程来处理嵌入式对象:

  • 对复杂对象图使用
    @Serialize
    注释。

    这解决了我的问题

    @Getter @Setter
    public class SurveyQuestions implements Serializable{
        private static final long serialVersionUID = -6930992373082651231L;
        @Serialize
        private Map<String,Object> optionGroup;
        
        
    }
    
    @Getter@Setter
    公共类SurveyQuestions实现可序列化{
    私有静态最终长serialVersionUID=-6930992373082651231L;
    @连载
    私有地图选项组;
    }
    
    我使用了
    @stringify
    ,但它不起作用。它在第一个数组中的嵌套映射i,e标签和第二个数组中的选项失败,该数组具有嵌套映射。您是否尝试使用@JsonUnwrapped?它是否按您希望的方式工作?@Jsonunwrapped不是必需的。我需要使用名为question的键保存问题,错误特定于>>objectify然后阅读:。响应已更新。我的所有键都是第一个选项组的字符串
    标签、collectDateInfo、collectTimeInfo、validationMessage、dateFormat
    和第二个选项组的
    名称、选项、代码这看起来应该没问题。完整的堆栈跟踪是什么?一般来说,如果您可以侥幸逃脱,那么最好在不使用java序列化的情况下对对象图进行建模。将来从python或其他语言读取@Serialized数据时会遇到问题。我已经更新了问题并添加了完整的堆栈跟踪。看起来是映射中列表中的内部映射导致了问题。您没有提到这是v5还是v6;如果是v6,可能是v6,我不确定。Objectify可以对地图上限值的类型
    Object
    执行的操作有很大的限制@序列化是正确的答案。或者,如果您想要更具可移植性的内容,可以将本机字段设置为私有字符串,并在生命周期方法中将其序列化/反序列化为JSON。
    In order to use non-String keys with Maps, you may specify the @Stringify annotation:
    
    import com.googlecode.objectify.annotation.Entity;
    import com.googlecode.objectify.annotation.Id;
    import com.googlecode.objectify.annotation.Stringify;
    import com.googlecode.objectify.stringifier.Stringifier;
    
    class DateStringifier implements Stringifier<LocalDate> {
        @Override
        public String toString(LocalDate obj) {
            return obj.getString();
        }
    
        @Override
        public LocalDate fromString(String str) {
            return new LocalDate(str);
        }
    }
    
    @Entity
    class Car {
        @Id Long id;
        @Stringify(DateStringifier.class)
        Map<LocalDate, ServiceRecord> serviceHistory = new HashMap<>();
    }
    
    class Item {
        private String title;
    
        @JsonProperty("date")
        private Date createdAt;
    
        // How to map this?
        @JsonUnwrapped
        private Author author;
    }
    
    @Getter @Setter
    public class SurveyQuestions implements Serializable{
        private static final long serialVersionUID = -6930992373082651231L;
        @Serialize
        private Map<String,Object> optionGroup;
        
        
    }