MappingJackson2HttpMessageConverter 找不到类型的 (Map) 密钥反序列化器

MappingJackson2HttpMessageConverter Can not find a (Map) Key deserializer for type

这是我的项目类的实体

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

@Entity
@Table(name="training")
public class Training {

    @Id
    @GeneratedValue
    private long id;
    
    private String topic;
    
    
    @OneToMany(mappedBy="training")     
    private Set<Session> sessions = new HashSet<Session>();
    
    public Training(){
        
    }
    
    public Training(String topic, TransitionLevel level, Set<Session> sessions) {
        this.topic = topic;
        this.level = level;
        this.sessions = sessions;
    }


    public long getId() {
        return id;
    }


    public void setId(long id) {
        this.id = id;
    }


    public String getTopic() {
        return topic;
    }


    public void setTopic(String topic) {
        this.topic = topic;
    }


    public Set<Session> getSessions() {
        return sessions;
    }


    public void setSessions(Set<Session> sessions) {
        this.sessions = sessions;
    }
    
}

这里是SessionTable

    @Entity
    @Table(name="session")
    public class Session {
    
        @Id
        @GeneratedValue
        private long id;
        
        private String location;
        
        @ManyToOne  
        @JoinColumn(name="training_id") 
        @JsonIgnore
        private Training training;
        
        private Date start;
        
        private Date end;
        
        
        @JoinTable(name="session_user",
                joinColumns = @JoinColumn(name="session_id"),
                inverseJoinColumns = @JoinColumn(name="trainingRole_id"))
        @MapKeyJoinColumn(name="user_id")
        @ElementCollection  
        @JsonIgnore
        

    private Map&lt;User, TrainingRole&gt; users = new HashMap&lt;User, TrainingRole&gt;();</div>
        
        public long getId() {
            return id;
        }
    
    
        public void setId(long id) {
            this.id = id;
        }
    
    
        public String getLocation() {
            return location;
        }
    
    
        public void setLocation(String location) {
            this.location = location;
        }
    
    
        public Training getTraining() {
            return training;
        }
    
    
        public void setTraining(Training training) {
            this.training = training;
        }
    
    
        public Date getStart() {
            return start;
        }
    
    
        public void setStart(Date start) {
            this.start = start;
        }
    
    
        public Date getEnd() {
            return end;
        }
    
    
        public void setEnd(Date end) {
            this.end = end;
        }
    
    
        public Map &lt;User, TrainingRole&gt; getUsers() {
            return users;
        }
    
    
        public void setUsers(Map&lt;User, TrainingRole&gt; users) {
            this.users = users;
        }
            
    }

这是用户实体

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    private long id;
    
    @Column(name="csl",unique=true)
    private String csl;
    
    @Column(name="fullName")
    private String fullName;
    
    
    @Column(name="email")
    private String email;       
    
    public User() {

    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    public String getCsl() {
        return csl;
    }


    public void setCsl(String csl) {
        this.csl = csl;
    }


    public String getFullName() {
        return fullName;
    }


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

}

我正在使用 JPARepository 在我的 mysql 数据库中保存训练和 session objects

但每当我保存训练 object 或 session object

我遇到了错误

c.j.MappingJackson2HttpMessageConverter : Failed to evaluate Jackson deserialization for type [simple type, class Session]: com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class User]

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

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

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));
    }
}

并且还要注释该字段

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