Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GlassFish JAX-RS自定义JSON序列化_Java_Glassfish_Jersey_Jax Rs_Jackson - Fatal编程技术网

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

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

我有一个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.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;
    }
}