2012-05-04 42 views
4

我有一個JAX-RS資源,我想使用@JsonSerialize(using=MySerializer.class)java.util.Calendar屬性使用自定義JSON序列化程序。GlassFish JAX-RS Jackson自定義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 

但如果我投入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而另一個不需要時有什麼區別?

回答

3

關於@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; 
    } 
} 
+0

好的,趕上,謝謝:-) – jabal

1

最後我發現了區別。

如果我將jackson-jaxrs.jar放入WAR的WEB-INF/lib中,那麼在web.xml中不需要POJOMappingFeature,它可以自動序列化POJO。

如果你沒有這個罐子,那麼你需要在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> 
相關問題