【问题标题】:GlassFish JAX-RS Jackson custom JSON serializationGlassFish JAX-RS Jackson 自定义 JSON 序列化
【发布时间】:2012-05-04 12:28:30
【问题描述】:

我有一个 JAX-RS 资源,我想使用 java.util.Calendar 属性为 @JsonSerialize(using=MySerializer.class) 使用自定义 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 中做了一个简单的项目,效果很好。

当我在其他具有不同部署的项目中使用它(EAR 带有多个 WAR 和 EJB JAR)时,我会收到

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-param>
   <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
   <param-value>true</param-value>
</init-param>

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

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

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

一个应用程序需要POJOMappingFeature 而另一个应用程序不需要有什么区别?

【问题讨论】:

    标签: java glassfish jersey jax-rs jackson


    【解决方案1】:

    关于@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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我终于发现了不同之处。

      如果我把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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        • 1970-01-01
        • 2011-04-12
        • 2013-01-18
        • 2016-03-22
        • 2014-08-02
        相关资源
        最近更新 更多