泽西+jackson反序列化失败与日期对象

我正在使用jersey和jackson来开发我的REST API,并且在反序列化日期字符串时遇到问题。 我在泽西岛注册了一个提供者类:

@Provider public class MyJsonProvider extends JacksonJsonProvider { public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; @Override public void writeTo(Object value, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { ObjectMapper mapper = locateMapper(type, mediaType); // Enable human readable date format SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); mapper.getDeserializationConfig().setDateFormat(sdf); mapper.getSerializationConfig().setDateFormat(sdf); // Enable JAXB annotation, with Jackson annotation being the preferred one. AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); AnnotationIntrospector secondary = new JaxbAnnotationIntrospector(); AnnotationIntrospector introspector = new AnnotationIntrospector.Pair(primary, secondary); mapper.getDeserializationConfig().setAnnotationIntrospector(introspector); mapper.getSerializationConfig().setAnnotationIntrospector(introspector); super.writeTo(value, type, genericType, annotations, mediaType, httpHeaders, entityStream); } } 

看起来泽西在启动时选择了它:

 Jan 24, 2011 2:53:23 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses INFO: Provider classes found: class com.mypackage.MyJsonProvider 

并且它适用于序列化,但是当我尝试反序列化像2010-01-25 00:00:00这样的字符串时,我收到映射错误:

 SEVERE: Servlet.service() for servlet JerseyWebApplication threw exception org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '2010-01-25 00:00:00': not a valid representation (error: Can not parse date "2010-01-25 00:00:00": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd")) at [Source: org.apache.catalina.connector.CoyoteInputStream@6a3d899a; line: 3, column: 37] at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:159) at org.codehaus.jackson.map.deser.StdDeserializationContext.weirdStringException(StdDeserializationContext.java:222) at org.codehaus.jackson.map.deser.StdDeserializer._parseDate(StdDeserializer.java:283) at org.codehaus.jackson.map.deser.DateDeserializer.deserialize(DateDeserializer.java:26) at org.codehaus.jackson.map.deser.DateDeserializer.deserialize(DateDeserializer.java:17) at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:135) at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:221) at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:391) at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:286) at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:1568) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:788) at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:398) at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:454) 

似乎泽西岛仍在使用JacksonJsonProvider以某种方式处理反序列化。 我不确定我做错了什么。 我应该如何在jersey内配置jackson? 谢谢!

super.writeTo方法再次调用locateMapper(type,mediaType)并创建mapper对象的新实例,以便从不使用配置dateformat的映射器对象。 您可以在调试模式下确认。

您可以做的是通过创建构造函数来创建自己的映射器对象

  MyJsonProvider(){ ObjectMapper mapper = new ObjectMapper(); // Enable human readable date format SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); mapper.getDeserializationConfig().setDateFormat(sdf); mapper.getSerializationConfig().setDateFormat(sdf); // Enable JAXB annotation, with Jackson annotation being the preferred one. AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); AnnotationIntrospector secondary = new JaxbAnnotationIntrospector(); AnnotationIntrospector introspector = new AnnotationIntrospector.Pair(primary, secondary); mapper.getDeserializationConfig().setAnnotationIntrospector(introspector); mapper.getSerializationConfig().setAnnotationIntrospector(introspector); super(mapper);} 

然后你不需要覆盖writeTo方法