MappingJackson2HttpMessageConverter 找不到类型的(映射)键反序列化器

5 hibernate jsonserializer jackson json-deserialization

这是我的项目的实体类

    导入 java.util.Iterator;
    导入 java.util.Map;
    导入 java.util.Set;

    @实体
    @Table(名称=“培训”)
    公开课培训{

        @ID
        @GeneratedValue
        私人长ID;

        私人字符串主题;


        @OneToMany(mappedBy="训练")     
        私人设置会话 = 新 HashSet();

        公共培训(){

        }

        公共培训(字符串主题,过渡级别级别,设置会话){
            this.topic = 主题;
            this.level = 级别;
            this.sessions = 会话;
        }


        公共长 getId() {
            返回标识;
        }


        公共无效 setId(长 ID){
            this.id = id;
        }


        公共字符串 getTopic() {
            返回主题;
        }


        公共无效设置主题(字符串主题){
            this.topic = 主题;
        }


        公共设置 getSessions() {
            返回会话;
        }


        公共无效setSessions(设置会话){
            this.sessions = 会话;
        }

    }



这是会话表

        @实体
        @Table(名称=“会话”)
        公共课会话{

            @ID
            @GeneratedValue
            私人长ID;

            私人字符串位置;

            @ManyToOne  
            @JoinColumn(name="training_id") 
            @JsonIgnore
            私人培训培训;

            私人日期开始;

            私人日期结束;


            @JoinTable(name="session_user",
                    joinColumns = @JoinColumn(name="session_id"),
                    inverseJoinColumns = @JoinColumn(name="trainingRole_id"))
            @MapKeyJoinColumn(name="user_id")
            @元素集合  
            @JsonIgnore


    private Map<User, TrainingRole> users = new HashMap<User, TrainingRole>();

            公共长 getId() {
                返回标识;
            }


            公共无效 setId(长 ID){
                this.id = id;
            }


            公共字符串 getLocation() {
                返回地点;
            }


            公共无效设置位置(字符串位置){
                this.location = 位置;
            }


            公共训练 getTraining() {
                回归训练;
            }


            public void setTraining(Training training) {
                this.training = 训练;
            }


            公共日期 getStart() {
                返回开始;
            }


            公共无效设置开始(日期开始){
                this.start = 开始;
            }


            公共日期 getEnd() {
                返回结束;
            }


            公共无效设置结束(日期结束){
                this.end = 结束;
            }


            公共地图 <User, TrainingRole> getUsers() {
                回访用户;
            }


            public void setUsers(Map<User, TrainingRole> users) {
                this.users = 用户;
            }

        }

这是用户实体

    @实体
    @表(名称=“用户”)
    公共类用户{

        @ID
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="id")
        私人长ID;

        @Column(name="csl",unique=true)
        私人字符串 csl;

        @Column(名称=“全名”)
        私人字符串全名;


        @Column(name="email")
        私人字符串电子邮件;       

        公共用户(){

        }

        公共长 getId() {
            返回标识;
        }

        公共无效 setId(长 ID){
            this.id = id;
        }


        公共字符串 getEmail() {
            回邮件;
        }

        公共无效setEmail(字符串电子邮件){
            this.email = 电子邮件;
        }


        公共字符串 getCsl() {
            返回 csl;
        }


        公共无效 setCsl(字符串 csl){
            this.csl = csl;
        }


        公共字符串 getFullName() {
            返回全名;
        }


        public void setFullName(String fullName) {
            this.fullName = fullName;
        }






    }

我正在使用 JPARepository 在我的 mysql 数据库中保存训练和会话对象

但是每当我保存训练对象或会话对象时

我收到错误

    cjMappingJackson2HttpMessageConverter:无法评估类型[简单类型,类会话]的Jackson反序列化:com.fasterxml.jackson.databind.JsonMappingException:找不到类型[简单类型,类用户]的(映射)键反序列化器

我用谷歌搜索,发现我需要手动序列化和反序列化..但我不知道该怎么做..请帮我..

小智 3

要使用您自己的类作为映射的键,您需要一个序列化器和反序列化器,就像您指出的那样。就像是:

public class CustomKeyDeserializer extends KeyDeserializer {

    private static ObjectMapper mapper = new ObjectMapper();

    @Override
    public Object deserializeKey(String key, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        return mapper.readValue(key, User.class);
    }
}

public class CustomKeySerializer extends JsonSerializer<User> {

    private static ObjectMapper mapper = new ObjectMapper();

    @Override
    public void serialize(User value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeFieldName(mapper.writeValueAsString(value));
    }
}
Run Code Online (Sandbox Code Playgroud)

并对字段进行注释

    @JsonDeserialize(keyUsing = CustomKeyDeserializer.class)
    @JsonSerialize(keyUsing = CustomKeySerializer.class)
    private Map<User, TrainingRole> users = new HashMap<User, TrainingRole>();
Run Code Online (Sandbox Code Playgroud)