2012-12-10 34 views
15

Tôi có ứng dụng JAX-RS sử dụng JBoss AS 7.1 và I POST/GET JSON và các đối tượng XML bao gồm Ngày (java.util.Date):Tuần tự hóa trong dịch vụ web REST REST dưới dạng chuỗi ISO-8601

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

Khi tôi sử dụng @Produce ("application/xml") trên phương thức get, objets được tuần tự hóa dưới dạng XML và ngày được chuyển thành chuỗi ISO-8601 (ví dụ: "2012-12-10T14: 50: 12.123 +02: 00 ").

Tuy nhiên, nếu tôi sử dụng @Produce ("application/json") trên phương thức get, ngày trong đối tượng JSON là dấu thời gian (ví dụ: "1355147452530") thay vì chuỗi ISO-8601.

Tôi làm cách nào để định cấu hình triển khai JAX-RS (RESTEasy) để tuần tự hóa các ngày ở định dạng JSON dưới dạng chuỗi ISO-8601 thay vì dấu thời gian?

Cảm ơn câu trả lời của bạn.

Lưu ý: Tôi cũng cố gắng sử dụng một nhà cung cấp tùy chỉnh JAX-RS để làm serialization JSON cho Ngày

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

nhà cung cấp này dường như được đăng ký bởi RESTeasy trên JBoss khởi động:

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

nhưng nó không bao giờ được sử dụng!

Trả lời

8

tôi giả phân tích cú pháp JSON của bạn là Jackson, hãy thử:

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

(kể từ khi Jackson 2.0)

2

Giá trị mặc định JBoss phân tích cú pháp là vứt bỏ, nhưng tôi đã không thể thay đổi định dạng ngày. Vì vậy, tôi chuyển sang Jackson và thêm lớp sau vào dự án của tôi để cấu hình nó:

@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

My JBoss EAP 7 JAX-RS implentation là RESTEasy và tôi đã làm' nt muốn thêm phụ thuộc Jackson. Sau một ngày nghiên cứu, tôi đã kết thúc với giải pháp của bạn ('JacksonConfig'). Tôi thêm Maven phụ thuộc ' com.fasterxml.jackson.core jackson-DataBind 2.8.7 'và sử dụng một định dạng ngày tháng tùy chỉnh' objectMapper.setDateFormat (SimpleDateFormat mới (" dd.MM.yyyy "))' thay vì tập hợp mặc định bằng 'objectMapper.configure()' –

1

người Xin lỗi vì la hét thật to - Tôi tìm thấy câu trả lời ở đây

http://wiki.fasterxml.com/JacksonFAQDateHandling,

đây

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

đây

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

đây

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

Sử dụng @JsonSerialize (sử dụng = ...) cách:

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); 
    } 
} 
Các vấn đề liên quan