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

Hibernate MappingJackson2HttpMessageConverter找不到类型的(映射)键反序列化器,hibernate,jackson,json-deserialization,jsonserializer,Hibernate,Jackson,Json Deserialization,Jsonserializer,以下是我的项目的实体类 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 topi

以下是我的项目的实体类

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 sessions = new HashSet(); public Training(){ } public Training(String topic, TransitionLevel level, Set 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 getSessions() { return sessions; } public void setSessions(Set sessions) { this.sessions = sessions; } } 导入java.util.Iterator; 导入java.util.Map; 导入java.util.Set; @实体 @表(name=“培训”) 公开课培训{ @身份证 @生成值 私人长id; 私有字符串主题; @OneToMany(mappedBy=“培训”) 私有集会话=新HashSet(); 公共培训(){ } 公共培训(字符串主题、过渡级别、集合课程){ this.topic=主题; 这个水平=水平; 这个。会话=会话; } 公共长getId(){ 返回id; } 公共无效集合id(长id){ this.id=id; } 公共字符串getTopic(){ 返回主题; } 公共void集合主题(字符串主题){ this.topic=主题; } 公共集getSessions(){ 返回会议; } 公共无效设置会话(设置会话){ 这个。会话=会话; } } 这是会议桌

@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<User, TrainingRole> users = new HashMap<User, TrainingRole>(); 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 <User, TrainingRole> getUsers() { return users; } public void setUsers(Map<User, TrainingRole> users) { this.users = users; } } @实体 @表(name=“session”) 公开课{ @身份证 @生成值 私人长id; 私有字符串位置; @许多酮 @JoinColumn(name=“training\u id”) @杰索尼奥雷 私人培训; 私人约会开始; 私人约会结束; @JoinTable(name=“session\u user”, joinColumns=@JoinColumn(name=“session\u id”), inverseJoinColumns=@JoinColumn(name=“trainingRole\u id”)) @MapKeyJoinColumn(name=“user\u id”) @元素集合 @杰索尼奥雷 私有映射用户=新HashMap(); 公共长getId(){ 返回id; } 公共无效集合id(长id){ this.id=id; } 公共字符串getLocation(){ 返回位置; } 公共void集合位置(字符串位置){ 这个位置=位置; } 公共培训{ 返乡培训; } 公共培训(培训){ 这个。训练=训练; } 公共日期getStart(){ 返回启动; } 公共作废设置开始(日期开始){ this.start=start; } 公共日期getEnd(){ 返回端; } 公共作废设置结束(日期结束){ this.end=end; } 公共地图getUsers(){ 返回用户; } 公共用户(地图用户){ this.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; } } @实体 @表(name=“user”) 公共类用户{ @身份证 @GeneratedValue(策略=GenerationType.AUTO) @列(name=“id”) 私人长id; @列(name=“csl”,unique=true) 私有字符串csl; @列(name=“fullName”) 私有字符串全名; @列(name=“email”) 私人字符串电子邮件; 公共用户(){ } 公共长getId(){ 返回id; } 公共无效集合id(长id){ this.id=id; } 公共字符串getEmail(){ 回复邮件; } 公用电子邮件(字符串电子邮件){ this.email=电子邮件; } 公共字符串getCsl(){ 返回csl; } 公共无效设置csl(字符串csl){ this.csl=csl; } 公共字符串getFullName(){ 返回全名; } public void setFullName(字符串fullName){ this.fullName=fullName; } } 我正在使用JPARepository在mysql数据库中保存培训和会话对象

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

我发现了错误

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] c、 j.MappingJackson2HttpMessageConverter:无法评估类型[简单类型,类会话]:com.fasterxml.Jackson.databind.JsonMappingException:找不到类型[简单类型,类用户]的(映射)键反序列化器
我在谷歌上搜索了一下,发现我需要手动序列化和反序列化。。但是我不知道怎么做。。请帮帮我

要使用自己的类作为映射的键,您需要一个序列化器和反序列化器,如您所示。比如:

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));
    }
}
公共类CustomKeyDeserializer扩展了KeyDeserializer{
私有静态ObjectMapper mapper=新ObjectMapper();
@凌驾
公共对象反序列化键(字符串键、反序列化上下文反序列化上下文)引发IOException、JsonProcessingException{
返回mapper.readValue(key,User.class);
}
}
公共类CustomKeySerializer扩展了JsonSerializer{
私有静态ObjectMapper mapper=新ObjectMapper();
@凌驾
public void serialize(用户值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException、JsonProcessingException{
gen.writeFieldName(mapper.writeValueAsString(值));
}
}
并对字段进行注释

    @JsonDeserialize(keyUsing = CustomKeyDeserializer.class)
    @JsonSerialize(keyUsing = CustomKeySerializer.class)
    private Map<User, TrainingRole> users = new HashMap<User, TrainingRole>();
@JsonDeserialize(keyUsing=CustomKeyDeserializer.class)
@JsonSerialize(keyUsing=CustomKeySerializer.class)
私有映射用户=新HashMap();

嘿,伙计。。这奏效了。。现在错误消失了,JSON也形成了。。但是你知道怎么去掉后面的斜线吗。。生成的JSON与“用户”类似:{“{”id\”:1、\“csl\”:“admin\”、“fullName\”:“admin\”、“…”。我认为您不能。键序列化程序所做的是从对象创建字符串,因为