2012-12-10 27 views
15

我有一個使用JBoss AS 7.1的JAX-RS應用程序,並且POST/GET JSON和XML對象包含日期(java.util.Date):作爲ISO-8601在JSON REST Web服務中序列化日期字符串

@XmlRootElement 
@XmlAccessorType(XmlAccessField.FIELD) 
public class MyObject implements Serializable 
{ 
    @XmlSchemaType(name = "dateTime") 
    private Date date; 
    ... 
} 

當我在GET方法使用@Produce( 「應用程序/ XML」),則OBJETS被序列化爲XML和日期轉換成ISO-8601的字符串(例如,「2012-12-10T14:50:12.123 +02:00" )。然而,如果我在get方法上使用@Produce(「application/json」),則JSON對象中的日期是時間戳(例如「1355147452530」)而不是ISO-8601字符串。

如何配置JAX-RS實現(RESTEasy)以JSON格式將日期序列化爲ISO-8601字符串而不是時間戳?

謝謝你的回答。

注:我還試圖用一個自定義的JAX-RS提供者做日期

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class CustomJsonDateProvider implements MessageBodyWriter<Date> 
{ 
    ... 
} 

該供應商似乎是RestEasy的JBoss上啓動註冊的JSON序列:

[org.jboss.jaxrs] Adding JAX-RS provider classes: package.CustomJsonDateProvider 
... 
[org.jboss.resteasy.cdi.CdiInjectorFactory] No CDI beans found for class package.CustomJsonDateProvider. Using default ConstructorInjector. 

但它從來沒有用過!

回答

8

我想你的JSON解析器是傑克遜,嘗試:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET") 
public Date date; 

(因爲傑克遜2.0)

2

默認的JBoss解析器拋棄,但我無法更改日期格式。所以我切換到傑克遜並添加下面的類到我的項目進行配置:

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class JacksonConfig implements ContextResolver<ObjectMapper> 
{ 
    private final ObjectMapper objectMapper; 

    public JacksonConfig() 
    { 
     objectMapper = new ObjectMapper(); 
     objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESPAMPS, false); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> objectType) 
    { 
     return objectMapper; 
    } 
} 
+0

我的JBoss EAP 7 JAX-RS implentation是的RESTEasy和我做」 nt想添加一個傑克遜依賴。經過一天的研究,我最終得到了解決方案('JacksonConfig')。我加了Maven的依賴' com.fasterxml.jackson.core傑克遜,數據綁定 2.8.7',並使用了自定義的日期格式'objectMapper.setDateFormat(新的SimpleDateFormat(「dd.MM。yyyy「))'而不是使用'objectMapper.configure()'設置的缺省值 –

1

對不起的人大聲叫喊 - 我在這裏找到了答案

http://wiki.fasterxml.com/JacksonFAQDateHandling

這裏

http://wiki.fasterxml.com/JacksonFAQ#Serializing_Dates

這裏

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

這裏

http://jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/map/util/StdDateFormat.html

使用@JsonSerialize(使用= ...)方式:

public class JsonStdDateSerializer 
extends JsonSerializer<Date> { 

    private static final DateFormat iso8601Format = 
    StdDateFormat.getBlueprintISO8601Format(); 

    @Override 
    public void serialize(
    Date date, JsonGenerator jgen, SerializerProvider provider) 
    throws IOException, JsonProcessingException { 

    // clone because DateFormat is not thread-safe 
    DateFormat myformat = (DateFormat) iso8601Format.clone(); 
    String formattedDate = myformat.format(date); 
    jgen.writeString(formattedDate); 
    } 
} 
相關問題