2016-09-12 52 views
1

重点解串器下面是我的项目MappingJackson2HttpMessageConverter找不到(图)类型

 

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

    } 



这里的实体类是会话表

 

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

     } 

这里是用户实体

 

    @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 : 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] 

我用Google搜索了一下,发现我需要序列化和反序列化手动..但我不知道如何做到这一点..请帮助我..

回答

0

要使用你自己的类作为映射的键,你需要一个串行器和解串器,就像你指出的那样。喜欢的东西:

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

嗨,哥们..这个工作。现在错误不见了,JSON也得到了构成..但你有什么想法如何删除生成的JSON就像这个“users”:{“{\”id \“:1,\”csl \“:\”admin \“,\”fullName \“:\”admin \“, “。 ......。 .. .. – Nawaz

+0

我不认为你可以。关键序列化器做的是从对象中创建一个字符串,因为json只能用字符串作为映射关键字。如果你删除反斜杠,你将有一个畸形的JSON。 第二个选项是将密钥更改为字符串。 – Franjavi