2016-09-12 50 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