2016-09-12 20 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が発生します。 2番目のオプションは、キーを文字列に変更することです。 – Franjavi

関連する問題