Сеансы JacksonConfig

Я использую Jackson JSON в приложении Spring 3 MVC. Чтобы не сериализовать каждое отдельное поле Date, я создал пользовательский объект, который использует определенный DateFormat:

@Component("jacksonObjectMapper")
public class CustomObjectMapper extends ObjectMapper
{
    Logger log = Logger.getLogger(CustomObjectMapper.class);

    @PostConstruct
    public void afterProps()
    {
        log.info("PostConstruct... RUNNING");
        //ISO 8601
        getSerializationConfig().setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ"));


    }

    //constructors...

}

Этот пользовательский ObjectMapper вводится в JsonConverter:

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json" />
    <property name="objectMapper" ref="jacksonObjectMapper" /> <!-- defined in CustomObjectMapper -->
</bean>

В журналах и сериализации нет исключений, но он не подбирает формат даты, он просто сериализуется в метку времени. Работает аннотация @PostConstruct, оператор журнала в методе находится в журналах.

Кто-нибудь знает, почему это не удается?

Ответ 1

Вам также может потребоваться указать, что вы хотите текстовую сериализацию даты, выполнив:

configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

(хотя я предполагал, что установка не нулевого формата даты также может вызвать его, но, возможно, не)

Кроме того, вы можете настроить конфигурацию непосредственно из конструктора (что безопасно). Не то, чтобы он менял поведение, но удалял необходимость в отдельном способе настройки.

Ответ 2

Я сделал следующее, которое работает, чтобы обойти совместимость с метками времени Java/PHP. Java использует миллисекунды, поскольку EPOCH и PHP используют секунды, поэтому было проще использовать даты ISO.

Объявляю следующие адаптеры сообщений:

<bean id="messageAdapter"
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean id="jacksonJsonMessageConvertor"
                class="my.app.MyMappingJacksonHttpMessageConverter"/>                   
        </list>
    </property>
</bean>

И MyMappingJacksonHttpMessageConverter выглядит следующим образом:

public class MyMappingJacksonHttpMessageConverter extends MappingJacksonHttpMessageConverter {

public MyMappingJacksonHttpMessageConverter(){
    super();
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
    setObjectMapper(objectMapper);
}
}

Выше все даты записываются в формате ISO.