i implement an restful webservice with jersey 2.0 (jax-rs 2.0) and jackson on a glassfish 4 (i also try it in tomcat 8 with the same result). I have an dto with an date propertie, which i want send to the webservice.
For serialization and deserialization i have my own (De)Serializer. In junit test i send the bean to the webservice and the webservice send the same bean back.
So In the request i see that the date is formated like yyyy-MM-dd'T'HH:mm:ss.SSSZ
, but in the response the date is like an unixtimestamp and my Deserializer throws an Exception java.text.ParseException: Unparseable date: "1378980107682"
Why my Server don't use my (De)Serializer classes?
The Request:
1 > Content-Type: application/json
{"name":"name1","lastname":"lastname2","date":"2013-09-12T13:26:30.752+0200"}
The Response:
2 < X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.0 Java/Oracle Corporation/1.7)
{"name":"name1","lastname":"lastname2","date":1378985190752}
My bean
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@JsonAutoDetect
@JsonIgnoreProperties (ignoreUnknown = true)
@JsonInclude (Include.NON_NULL)
public class User {
private String name;
private String lastname;
private Date date;
@JsonSerialize (using = MyDateSerializer.class)
public Date getDate() {
return date;
}
@JsonDeserialize (using = MyDateDeserializer.class)
public void setDate(Date date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
}
My Serializer
public class MyDateSerializer extends JsonSerializer<Date> {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
@Override
public void serialize(Date aDate, JsonGenerator aJsonGenerator, SerializerProvider aSerializerProvider)
throws IOException, JsonProcessingException {
System.out.println("MyDateSerializer.serialize()");
String dateString = dateFormat.format(aDate);
System.out.println("dateString [" + dateString + "]");
aJsonGenerator.writeString(dateString);
}
}
My Deserializer
public class MyDateDeserializer extends JsonDeserializer<Date> {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
System.out.println("MyDateDeserializer.deserialize()");
String date = jsonParser.getText();
System.out.println("MyDateDeserializer.getText [" + date + "]");
try {
return format.parse(date);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
My Application
public class MyRESTExampleApplication extends ResourceConfig {
public MyRESTExampleApplication() {
packages("com.carano.fleet4all.restExample");
register(JacksonConfigurator.class);
register(JacksonFeature.class);
}
}
My web.xml
<display-name>restExample</display-name>
<servlet>
<display-name>JAX-RS REST Servlet</display-name>
<servlet-name>REST-Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.carano.fleet4all.restExample.MyRESTExampleApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>REST-Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>