2017-01-01 2 views
0

J'ai écrit un sérialiseur et un désérialiseur personnalisés pour la classe com.google.common.collect.Table. Mais il ne se fait pas appeler tout en persistant cet objet dans MongoDB. J'utilise Spring 4, Spring-MongoDB 1.9 et Jackson 2.8.4. Voici la classe et la configuration. Pourriez-vous s'il vous plaît laissez-moi savoir ce qui ne va pas avec ça. Je veux que ces classes soient appelées pendant la persistance et la récupération de MongoDB.Le sérialiseur et le désérialiseur JSON de printemps ne sont pas appelés

public class TableSeserializer extends StdSerializer<Table> { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public TableSeserializer() { 
     this(Table.class); 
    } 

    public TableSeserializer(Class<Table> t) { 
     super(t); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public void serialize(Table value, JsonGenerator gen, SerializerProvider provider) 
      throws IOException { 
     gen.writeStartObject(); 
     value.rowMap().forEach((i,map) ->{ 
      try { 
       gen.writeNumber((int)i); 
       ((Map)map).forEach((k,v)->{ 
        try { 
         gen.writeStartObject(); 
         Object object = ((Map)map).get(k); 
         if (object instanceof HTMLInputTag) { 
          HTMLInputTag inputTag = (HTMLInputTag) object; 
          gen.writeObjectField(inputTag.getId(),inputTag); 
         }else{ 
          gen.writeObjectField(object.toString(),object); 
         } 

         gen.writeEndObject(); 

        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       }); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     }); 
     gen.writeEndObject(); 
    } 
} 

public class TableDeserializer extends StdDeserializer<Table<Integer, String, HTMLInputTag>> { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    protected TableDeserializer(Class<?> vc) { 
     super(vc); 
    } 

    public TableDeserializer() { 
     this(null); 
    } 

    @Override 
    public Table<Integer, String, HTMLInputTag> deserialize(JsonParser jsonparser, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException { 
     String data = jsonparser.getText(); 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode node = mapper.readTree(data); 


     return null; 
    } 

} 

configuration Spring

@Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     SimpleModule module = new SimpleModule(); 
     module.addSerializer(Table.class, new TableSeserializer()); 
     module.addDeserializer(Table.class, new TableDeserializer()); 
     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().modules(module); 

     converters.add(jacksonConverter(builder)); 
    } 

    @Bean 
    MappingJackson2HttpMessageConverter jacksonConverter(Jackson2ObjectMapperBuilder builder) { 
     return new MappingJackson2HttpMessageConverter(builder.build()); 
    } 

Annotation en classe

public class OrganizationAttributeMetaData extends CommonDomainAttributes implements Cloneable, Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private String attributeName; 
    private int orgid; 
    private String uniquecode; //3 Character unique code to uniquely identify 

    @JsonDeserialize(using=TableDeserializer.class) 
    @JsonSerialize(using=TableSeserializer.class) 
    Table<Integer, String, HTMLInputTag> htmlAttributes = null; //row,identifier and HTML 

} 
+1

Spring mongo db utilise la sérialisation/désérialisation de mongo db. Vous devrez convertir ces sérialiseurs/désérialiseurs Jackson en convertisseurs à ressort et les enregistrer avec des convertisseurs de cartographie mongo. – Veeram

Répondre

1

Vous avez vraiment mélangé des choses;) MongoDB en effet stocke les données au format JSON-like (BSON - JSON binaire) mais n'a rien à voir avec Jackson - qui est utilisé (comme vous l'avez montré) pour sérialiser/désérialiser les objets envoyés via HTTP.

Dans Spring Data MongoDB, vous devez implémenter et configurer des convertisseurs personnalisés. Plus à ce sujet peut être lu here.