Spring JSON Serializer и Deserializer не вызывается

Я написал собственный сериализатор и десериализатор для класса com.google.common.collect.Table. Но он не вызывается при сохранении этого объекта в MongoDB. Я использую Spring 4, Spring-MongoDB 1.9 и Jackson 2.8.4. Ниже приведены класс и конфигурация. Не могли бы вы сообщить мне, что с этим не так. Я хочу, чтобы эти классы вызывались при сохранении и извлечении из MongoDB.

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

}

Конфигурация пружины

@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

}

person Debopam    schedule 01.01.2017    source источник
comment
Spring mongo db использует сериализацию/десериализацию mongo db. Вам нужно будет преобразовать эти сериализаторы/десериализаторы Jackson в преобразователи spring и зарегистрировать их в преобразователях отображения mongo.   -  person s7vr    schedule 01.01.2017


Ответы (1)


Вы действительно перепутали некоторые вещи;) MongoDB действительно хранит данные в формате, подобном JSON (BSON - Binary JSON), но это не имеет ничего общего с Джексоном, который используется (как вы показали) для сериализации/десериализации объектов, отправленных через HTTP.

В Spring Data MongoDB вам необходимо реализовать и настроить пользовательские преобразователи. Подробнее об этом можно прочитать здесь.

person Rafal G.    schedule 01.01.2017