2012-12-10 25 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); 
    } 
} 
相关问题