Полиморфная сериализация Джексона порождает неправильное имя класса

Когда я использую полиморфную сериализацию Джексона, он генерирует объект JSON с неправильным полным именем класса.

Следующий код преобразует XMLGregorianCalendar. Выход:

["java.util.GregorianCalendar",-3600000]

Я ожидал следующего:

["javax.xml.datatype.XMLGregorianCalendar",-3600000]

Почему он выводит java.util.GregorianCalendar?

Или что еще более важно: как это исправить?

Пример кода:

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.io.ByteArrayOutputStream;

public class JacksonGregorianProblem {

    public static void main(String[] args) throws java.io.IOException, DatatypeConfigurationException {

        XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar();
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        mapper.writeValue(byteArrayOutputStream, xmlGregorianCalendar);

        System.out.println(byteArrayOutputStream);
    }
}
+2
источник поделиться
1 ответ

Чтобы получить ожидаемое поведение, я внедрил собственный сериализатор XMLGregorianCalendar. Этот класс заботится о сериализации XLMGregorianCalendar, и теперь результат - именно то, что я ожидаю. :-)

class XMLGregorianCalendarSerializer extends StdSerializer<XMLGregorianCalendar> {

    public XMLGregorianCalendarSerializer() {
        this(null);
    }

    public XMLGregorianCalendarSerializer(Class<XMLGregorianCalendar> t) {
        super(t);
    }

    @Override
    public void serialize(XMLGregorianCalendar value, JsonGenerator gen, SerializerProvider provider)
        throws IOException
    {
        gen.writeNumber(value.toGregorianCalendar().getTimeInMillis());
    }

    @Override
    public void serializeWithType(XMLGregorianCalendar value, JsonGenerator gen, SerializerProvider provider,
        TypeSerializer typeSerializer) throws IOException
    {
        gen.writeStartArray();
        gen.writeString("javax.xml.datatype.XMLGregorianCalendar");
        serialize(value, gen, provider); // call your customized serialize method
        gen.writeEndArray();
    }
}

Вы можете добавить этот сериализатор в карту объектов с помощью кода ниже. Он может быть вставлен в примере кода в вопросе.

    SimpleModule module = new SimpleModule();
    module.addSerializer(XMLGregorianCalendar.class, new XMLGregorianCalendarSerializer());
    mapper.registerModule(module);
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос