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

标签 java glassfish jersey jax-rs jackson

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

当我在具有不同部署的其他项目(具有多个 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

但是如果我把 init-parameter 放入 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 而另一个应用程序不需要,这有什么区别?

最佳答案

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

关于java - GlassFish JAX-RS Jackson 自定义 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448799/

相关文章:

java - RabbitMq 错误 - 连接被拒绝 : connect

java - 如果处理请求体时发生异常,则不使用 Jersey 自定义 ExceptionMapper

java - 为什么我的 JTextArea 中没有 JScrollPane?

java - 在JSP中使用java代码打开输入文件

java - JMS客户端收不到消息

postgresql - 为什么 JPA 实体管理器使用 glassfish 导致重复键值错误?

java - 使用 Jersey 获取 REST 资源作为 List<T>

java - entitymanager 的正确使用方法是什么

java - 将基于 Maven 的应用程序转换为基于 Jar 的应用程序后,它停止工作

Netbeans IDE 中的 Java 代码为 : Code executed is the older one!,即使我对代码进行了更改