3

Every object with Date format is being serialized as a long.

I've read around that I need to create a custom object mapper

and so I did:

public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        super();
        configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
        setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    }

}

I've also registered that custom mapper as a converter

@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(converter());
    addDefaultHttpMessageConverters(converters);
}

@Bean
MappingJacksonHttpMessageConverter converter() {
    MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
    converter.setObjectMapper(new CustomObjectMapper());

    return converter;
}

but still, it doesn't work, and I recieve a long as a date.

Any idea what am I doing wrong?

Itai Sagi
  • 5,537
  • 12
  • 49
  • 73

2 Answers2

4

You'll need to implement your own Dateserializer, just like the following (got it from this tutorial, so props to Loiane, not me ;-) ):

package ....util.json;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class JsonDateSerializer extends JsonSerializer<Date>{

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm "); // change according to your needs 

@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
        throws IOException {

    String formattedDate = dateFormat.format(date);

    gen.writeString(formattedDate);
}

}

then you could just add the following annotation to your Date-Objects and it will persist fine:

@JsonSerialize(using = JsonDateSerializer.class)
public Date getCreated() {
    return created;
}

At least it works with spring 3.2.4 and jackson 1.9.13 here.

edit: Think about using FastDateFormat instead of SimpleDateFormat, for it's the threadsafe-alternative (as mentioned in the comments of Loianes article)

Dominik
  • 2,801
  • 2
  • 33
  • 45
  • Hi Dominik, this will work, but I have alot of Date objects across many DTOs, so it's not a viable solution. – Itai Sagi Dec 10 '13 at 12:50
  • Why is it a problem? Perhaps you could write a short PERL-script to handle that ... – Thomas Junk Dec 10 '13 at 13:05
  • @ItaiSagi Just looking at my old answers and found this one. Indeed, you'd have to do that, but... well, as MR. Junk said, it just is the way to go, so it would be nice if you accept this answer :-) Or did you find another way? If so, please tell me, i'd be very interested. Best regards – Dominik Nov 22 '15 at 17:55
0

Try adding 0 as index in #add()

@Configuration
@ComponentScan()
@EnableWebMvc
@PropertySource("classpath:/web.properties")
public class WebConfig extends WebMvcConfigurerAdapter
{

    @Override
    public void configureMessageConverters(final List<HttpMessageConverter<?>> converters)
    {
        converters.add(0, jsonConverter());
    }

    @Bean
    public MappingJacksonHttpMessageConverter jsonConverter()
    {
        final MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
        converter.setObjectMapper(new CustomObjectMapper());

        return converter;
    }
}

It worked for me.

user2777500
  • 111
  • 5