GlassFish JAX-RS Jackson自定义JSON序列化

kav*_*i77 5 java glassfish jax-rs jersey jackson

我有一个JAX-RS资源,我想使用自定义JSON序列化器来获取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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

但是如果我在web.xml中加入init-parameter

<init-param>
   <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
   <param-value>true</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

json序列化工作,但@JsonSerialize注释不起作用.

另一方面,Netbeans项目不需要POJOMappingFeature.

这两个应用程序之间可能有什么区别?

在一个应用程序需要POJOMappingFeature而另一个应用程序不需要的地方有什么不同?

kav*_*i77 4

关于@JsonSerialize失败:如果你有一个字段的 getter,你需要用@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;
    }
}
Run Code Online (Sandbox Code Playgroud)