2011-01-24 23 views
7

REST API'mı geliştirmek için jersey ve jackson birlikte kullanıyorum ve bir tarih dizgesini serileştirirken sorun yaşıyorum. Ben Jersey'de bir sağlayıcı sınıfı kayıt vardır:Jersey + Jackson tarih nesnesi bozukluğu

@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); 
    } 
} 

Ve Jersey başlatma sırasında onu aldım gibi görünüyor:

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

Ve serileştirme için çalışıyor, ama bir dize serisini çalıştığımızda

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: [email protected]; 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) 

hala nasılsa deserialization işlemek için JacksonJsonProvider kullanıyor Jersey gibi görünüyor: 2010-01-25 00:00:00 gibi, ben bir eşleme hata alıyorum. Ne yapıyorum emin değilim. Jersey'deki jumper'ı nasıl yapılandırmalıyım? Teşekkürler!

+7

kendim geçersiz kılmak gerekmez Sonra bir kurucu

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);} 

oluşturarak kendi mapper nesne oluşturmak olduğunu. Çıkarıldı deserialization yapılandırmasını writeTo() yönteminde değil readFrom() yönteminde ayarlamam gerekiyor. Duh. – fei

+3

Neden bu "çok yerelleştirilmiş" olarak kapalı? Jersey ile Jersey yaygın bir senaryo. – Paul

+5

@fei cevap olarak ekleyebilirsiniz – eis

cevap

2

super.writeTo yöntem çağrıları locateMapper (type, mediaType) öğelerini tekrar çağırır ve yeni bir mapper nesnesi örneği oluşturur; böylece, dateformat'ı yapılandırdığınız mapper nesnesi hiçbir zaman kullanılmaz. Hata ayıklama modunda onaylayabilirsiniz. Ne yapabilirsiniz

ben bunu anladım WriteTo yöntemini

İlgili konular