2017-01-01 19 views
0

我爲com.google.common.collect.Table類編寫了自定義串行器和解串器。但是在MongoDB中持久化這個對象的時候並沒有被調用。我使用Spring 4,Spring-MongoDB 1.9和Jackson 2.8.4。以下是課程和配置。你能不能讓我知道這有什麼問題。我希望這些類在從MongoDB持久化和檢索時被調用。Spring JSON串行器和解串器沒有被調用

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

} 

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

註釋

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使用mongo db的序列化/反序列化。您需要將這些Jackson串行器/解串器轉換爲彈簧轉換器,並使用mongo映射轉換器進行註冊。 – Veeram

回答

1

你真的混合一些事情;)在類JSON格式MongoDB的確實存儲數據(BSON - 二進制JSON),但它與Jackson沒有任何關係 - 它使用(如你所展示的方式)來序列化/反序列化通過HTTP發送的對象。

在Spring Data MongoDB中,您需要實現和配置自定義轉換器。更多關於這可以被讀取here