2017-01-01 76 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