21

我有一个使用 JBoss AS 7.1 的 JAX-RS 应用程序,并且我发布/获取 JSON 和 XML 对象,其中包括日期(java.util.Date):

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

当我在 get 方法上使用 @Produce("application/xml") 时,对象被序列化为 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 提供程序对日期进行 JSON 序列化

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

这个提供者似乎是由 RESTeasy 在 JBoss 启动时注册的:

[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.

但它从未使用过!

4

4 回答 4

15

我假设您的 json 解析器是 Jackson,请尝试:

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

(自杰克逊 2.0 起)

于 2013-05-22T13:53:28.390 回答
3

默认的 JBoss 解析器是 Jettison,但我无法更改日期格式。所以我切换到 Jackson 并在我的项目中添加了以下类来配置它:

@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;
    }
}
于 2013-05-27T07:48:02.290 回答
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(using= ... ) 方式:

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);
  }
}
于 2015-09-30T10:21:46.510 回答
0

声明SerializerSoap/XML 使用的相同:

@XmlElement(name = "prealert_date")
@XmlSchemaType(name = "dateTime")
@JsonSerialize(using = XMLGregorianCalendarSerializer.class)
protected XMLGregorianCalendar prealertDate;
于 2018-04-23T13:56:23.773 回答