2011-01-24 3 views
7

ジャージとジャクソンを一緒に使用してREST APIを開発しています。日付文字列をデシリアライズするときに問題が発生しています。私は、ジャージーでプロバイダクラスを登録します:Jersey +ジャケットのデシリアライズに日付オブジェクトが含まれていません

@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 

そして、それは直列化のために正常に動作しますが、私は、文字列をデシリアライズしようとしたとき、

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) 

それはまだ何とか直列化復元を処理するためにJacksonJsonProviderを使用しているジャージーのように思える:2010-01-25 00:00:00のような、私は、マッピングエラーを取得しています。私は何が間違っているのか分かりません。ジャージー内でジャクソンをどのように構成すればよいですか?ありがとう!

+7

をオーバーライドする必要がいけません。私は、writeTo()メソッドではなく、readFrom()メソッドでデシリアライズ設定を設定する必要があります。ダー。 – fei

+3

なぜこれは「ローカライズされていますか? JacksonとのJerseyは一般的なシナリオです。 – Paul

+5

@feiあなたはそれを答えとして追加することができます – eis

答えて

2

super.writeToメソッドは、locateMapper(type、mediaType)を再度呼び出し、マッパーオブジェクトの新しいインスタンスを作成し、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メソッド

関連する問題