2012-05-04 12 views
4

私はJAX-RSリソースを持っています。@JsonSerialize(using=MySerializer.class)を使用してjava.util.Calendar属性用のカスタムJSONシリアライザを使用したいと思います。GlassFish JAX-RS JacksonカスタムJSONシリアル化

import java.util.Calendar; 
import org.codehaus.jackson.map.annotate.JsonSerialize; 

public class FooBar { 

    @JsonSerialize(using=MySerializer.class) 
    private Calendar calendar; 

    public FooBar() { 
     calendar = Calendar.getInstance(); 
    } 

    public Calendar getCalendar() { 
     return calendar; 
    } 
} 

MySerializer.java:

import java.io.IOException; 
import java.util.Calendar; 

import org.codehaus.jackson.JsonGenerator; 
import org.codehaus.jackson.JsonProcessingException; 
import org.codehaus.jackson.map.JsonSerializer; 
import org.codehaus.jackson.map.SerializerProvider; 

public class MySerializer 
    extends JsonSerializer<Calendar> 
{ 

    @Override 
    public void serialize(Calendar c, JsonGenerator jg, SerializerProvider sp) 
     throws IOException, JsonProcessingException 
    {    
     jg.writeString("fooBar Calendar time: " + c.getTime()); 
    } 

} 

私は、NetBeans 7.1で簡単なプロジェクトを作って、それがうまく動作します。私はその後、私は

javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class 
com.example.FooBar and MIME media type application/json was not found 

を受け取るしかし、さまざまな展開(複数のWARおよびEJB JARファイルとEAR)と他のプロジェクトで使用

私は、web.xmlに初期化パラメータを置けば

<init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
</init-param> 

json serialization works、 ただし、@JsonSerialize注釈は機能しません。

一方、NetbeansプロジェクトではPOJOMappingFeatureは必要ありません。

これら2つのアプリケーションの違いは何ですか?

1つのアプリケーションにPOJOMappingFeatureが必要で、もう1つでは違いがありますか?

答えて

3

を:あなたは、フィールドのゲッターを持っている場合は、注釈を付ける必要がありますフィールド自体ではなく@JsonSerializeのgetterメソッド! getterメソッドはシリアル化の分野よりも優先されているようです。したがって、作業コードは

import java.util.Calendar; 
import org.codehaus.jackson.map.annotate.JsonSerialize; 

public class FooBar { 

    private Calendar calendar; 

    public FooBar() { 
     calendar = Calendar.getInstance(); 
    } 

    @JsonSerialize(using=MySerializer.class) 
    public Calendar getCalendar() { 
     return calendar; 
    } 
} 
+0

です。Nice catch、thanks :-) – jabal

1

最後に、私は違いを発見しました。

jackson-jaxrs.jarをWARのWEB-INF/libに入れると、web.xmlにはPOJOMappingFeatureが必要なくなり、自動的にPOJOをシリアル化できます。

あなたは、このjarファイルを持っていない場合、あなたはweb.xmlで次のエントリが必要です。@JsonSerialize故障について

<servlet> 
    <servlet-name>ServletAdaptor</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>  
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    ... 
</servlet> 
関連する問題