Java GlassFish JAX-RS自定义JSON序列化
我有一个JAX-RS资源,我想使用Java GlassFish JAX-RS自定义JSON序列化,java,glassfish,jersey,jax-rs,jackson,Java,Glassfish,Jersey,Jax Rs,Jackson,我有一个JAX-RS资源,我想使用@JsonSerialize(using=MySerializer.class)为java.util.Calendar属性使用自定义JSON序列化程序 MySerializer.java: import java.io.IOException; import java.util.Calendar; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonProcess
@JsonSerialize(using=MySerializer.class)
为java.util.Calendar
属性使用自定义JSON序列化程序
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());
}
}
但是如果我在web.xml中输入init参数
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
com.sun.jersey.api.json.POJOMappingFeature
真的
json序列化工作,
但是@JsonSerialize
注释不起作用
另一方面,Netbeans项目不需要POJOMappingFeature
这两个应用程序之间有什么区别
当一个应用程序需要
POJOMappingFeature
而另一个不需要时,有什么区别呢?最后我发现了区别
如果我将jackson jaxrs.jar
放入WAR的WEB-INF/lib中,那么WEB.xml中不需要POJOMappingFeature
,它可以自动序列化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>
伺服适配器
com.sun.jersey.spi.container.servlet.ServletContainer
com.sun.jersey.api.json.POJOMappingFeature
真的
...
关于@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;
}
}
<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>
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;
}
}