5

JAX-RS リソースがありjava.util.Calendar@JsonSerialize(using=MySerializer.class).

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 で簡単なプロジェクトを作成しましたが、うまく機能します。

別のデプロイメント (複数の WAR と EJB JAR を持つ EAR) の他のプロジェクトでそれを使用すると、

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

しかし、web.xml に init-parameter を入れると

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

json シリアライゼーションは機能しますが、@JsonSerializeアノテーションは機能しません。

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

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

あるアプリケーションが必要とするアプリケーションと必要としないアプリケーションの違いは何POJOMappingFeatureですか?

4

2 に答える 2

4

失敗について: フィールドのゲッターがある場合は、フィールド自体ではなく、@JsonSerializeゲッター メソッドにアノテーションを付ける必要があります。@JsonSerializeゲッターメソッドは、シリアライゼーションのフィールドよりも優先されるようです。したがって、作業コードは次のとおりです。

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;
    }
}
于 2012-05-07T10:10:55.260 に答える
1

ついに違いがわかりました。

jackson-jaxrs.jarWARのWEB-INF/libに入れるPOJOMappingFeatureと、web.xmlに何も必要ありません。POJOを自動的にシリアル化できます。

このjarがない場合は、web.xmlに次のエントリが必要です。

<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>
于 2012-05-07T10:04:13.327 に答える