2016-09-12 2 views
1

Вот классы сущностей для моего проектаMappingJackson2HttpMessageConverter Не удается найти (карта) Key десериализатор для типа

 

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

    } 



Вот таблица Session

 

     @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 Пользователь

 

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

Я гугле его и обнаружил, что мне нужно для сериализации и десериализации вручную .. но я понятия не имею, как это сделать .. Пожалуйста, помогите мне ..

ответ

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

Hey Man .. это работает .. Теперь исчезла ошибка и JSON также был сформирован .. но у вас есть какие-либо идеи, как удалить обратные слэши .. сгенерированный JSON подобен этим «пользователям»: {"{\" id \ ": 1, \" csl \ ": \" admin \ ", \" fullName \ ": \" admin \ ", \ "... .... .. .. – Nawaz

+0

не думаю, что вы можете. Что делает ключевой сериализатор, это создать строку из объекта, потому что json работает только со строками в виде клавиш карты. Если вы удалите обратные косые черты, у вас будет неправильный json. Второй вариант - изменить ключ на строку. – Franjavi

Смежные вопросы