2016-09-12 1 views
1

Voici les classes d'entités pour mon projetMappingJackson2HttpMessageConverter ne peut pas trouver un (Carte) désérialiseur clé pour le type

 

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

    } 



Voici la session Tableau

 

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

     } 

Voici l'entité utilisateur

J'utilise JPARepository pour enregistrer des objets de formation et de session dans ma base de données mysqlJ'utilise JPARepository

Mais chaque fois que je sauve l'objet de la formation ou de l'objet de la session

Je reçois l'erreur

 

    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] 

Je googlé et trouvé que je dois sérialisation et la désérialisation manuellement .. mais je ne sais pas comment faire cela .. S'il vous plaît aidez-moi ..

Répondre

0

Pour utiliser vos propres classes en tant que clés pour les cartes, vous avez besoin d'un sérialiseur et d'un désérialiseur, comme vous l'indiquez. Quelque chose comme:

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

Et aussi annoter le champ

@JsonDeserialize(keyUsing = CustomKeyDeserializer.class) 
    @JsonSerialize(keyUsing = CustomKeySerializer.class) 
    private Map<User, TrainingRole> users = new HashMap<User, TrainingRole>(); 
+0

Hey Man .. cela a fonctionné .. Maintenant, l'erreur a disparu et JSON a également obtenu formé .. mais avez-vous une idée de supprimer le dos slash .. le JSON généré est comme ceci "users": {"{\" id \ ": 1, \" csl \ ": \" admin \ ", \" nom complet \ ": \" admin \ ", \ "... .... .. .. – Nawaz

+0

Je ne pense pas que vous pouvez. Le sérialiseur de clés crée une chaîne à partir de l'objet, car json ne fonctionne qu'avec des chaînes comme clés de carte. Si vous supprimez les barres obliques arrière, vous aurez un JSON mal formé. Une deuxième option consiste à remplacer la clé par une chaîne. – Franjavi