Jersey + Jackson JSON date format serialization - how to change the format or use custom JacksonJsonProvider

前端 未结 8 1114
花落未央
花落未央 2020-11-30 00:54

I am using Jersey + Jackson to provide REST JSON services layer for my application. The problem I have is that the default Date serialization format looks like that:

相关标签:
8条回答
  • 2020-11-30 01:10

    Re-write the MessageBodyWriterJSON with this

    import javax.ws.rs.core.MediaType; 
    import javax.ws.rs.ext.Provider; 
    
    import org.codehaus.jackson.jaxrs.JacksonJsonProvider; 
    import org.codehaus.jackson.map.ObjectMapper; 
    import org.codehaus.jackson.map.SerializationConfig; 
    
    @Provider 
    public class MessageBodyWriterJSON extends JacksonJsonProvider { 
                public MessageBodyWriterJSON (){ 
                } 
    
            @Override 
                public ObjectMapper locateMapper(Class<?> type, MediaType mediaType) 
            { 
            ObjectMapper mapper = super.locateMapper(type, mediaType); 
            //DateTime in ISO format "2012-04-07T17:00:00.000+0000" instead of 'long' format 
                mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); 
                return mapper; 
            } 
    }
    
    0 讨论(0)
  • 2020-11-30 01:21

    To configure your own ObjectMapper, you need to inject your own class that implements ContextResolver<ObjectMapper>

    Exactly how to get jersey to pick this up will kind of depend on your IOC (spring, guice). I use spring, and my class looks something like this:

    import javax.ws.rs.ext.ContextResolver;
    import javax.ws.rs.ext.Provider;
    
    import org.codehaus.jackson.map.ObjectMapper;
    import org.codehaus.jackson.map.SerializationConfig.Feature;
    import org.codehaus.jackson.map.deser.CustomDeserializerFactory;
    import org.codehaus.jackson.map.deser.StdDeserializerProvider;
    import org.codehaus.jackson.map.ser.CustomSerializerFactory;
    import org.springframework.stereotype.Component;
    
    // tell spring to look for this.
    @Component
    // tell spring it's a provider (type is determined by the implements)
    @Provider
    public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
        @Override
        public ObjectMapper getContext(Class<?> type) {
            // create the objectMapper.
            ObjectMapper objectMapper = new ObjectMapper();
            // configure the object mapper here, eg.
               objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
            return objectMapper;
        }
    }
    
    0 讨论(0)
提交回复
热议问题