Jersey + Jackson deserialization failure with date object

Я использую 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<String,Object> 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 для того, чтобы каким-то образом обрабатывать десериализацию. Я не уверен, что делаю не так. Как мне настроить джексон в джерси? Спасибо!

7
задан Durandal 31 January 2014 в 04:35
поделиться