【问题标题】:MappingJackson2HttpMessageConverter Can not find a (Map) Key deserializer for typeMappingJackson2HttpMessageConverter 找不到类型的(映射)键反序列化器
【发布时间】:2017-01-19 14:57:00
【问题描述】:

这是我项目的实体类

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

这是会话表

    @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 数据库中

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

我收到了错误

c.j.MappingJackson2HttpMessageConverter:无法评估类型 [简单类型,会话类] 的杰克逊反序列化: com.fasterxml.jackson.databind.JsonMappingException:找不到 (Map) 类型 [simple type, class User] 的密钥反序列化器

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

【问题讨论】:

    标签: hibernate jackson json-deserialization jsonserializer


    【解决方案1】:

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

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

    【讨论】:

    • 嘿,伙计 .. 这行得通 .. 现在错误消失了,JSON 也形成了 .. 但是你知道如何删除反斜杠 .. 生成的 JSON 就像这样“用户":{"{\"id\":1,\"csl\":\"admin\",\"fullName\":\"admin\",\" .. . ... . .. ..
    • 我不认为你可以。键序列化器所做的是从对象创建一个字符串,因为 json 仅使用字符串作为映射键。如果删除反斜杠,您将获得格式错误的 json。第二种选择是将密钥更改为字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多