我使用jersey 2.0(jax-rs 2.0)和jackson在glassfish 4上实现了一个宁静的web服务(我也尝试在tomcat 8中使用相同的结果)。 我有一个日期属性的dto,我想发送到网络服务。
对于序列化和反序列化,我有自己的(De)Serializer。 在junit测试中,我将bean发送到webservice,webservice将相同的bean发回。
所以在请求中我看到日期格式化为yyyy-MM-dd'T'HH:mm:ss.SSSZ
,但在响应中日期就像一个unixtimestamp而我的Deserializer抛出异常java.text.ParseException: Unparseable date: "1378980107682"
为什么我的服务器不使用我的(De)Serializer类?
请求:
1 > Content-Type: application/json
{"name":"name1","lastname":"lastname2","date":"2013-09-12T13:26:30.752+0200"}
回应:
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}
我的豆子
@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);
}
}
我的解串器
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);
}
}
}
我的申请
public class MyRESTExampleApplication extends ResourceConfig {
public MyRESTExampleApplication() {
packages("com.carano.fleet4all.restExample");
register(JacksonConfigurator.class);
register(JacksonFeature.class);
}
}
我的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>
答案 0 :(得分:2)
一种可能性是,您使用的是错误的注释集,与使用的Jackson版本有关。 Jackson 1.x和2.x生活在不同的Java包中(1.x在“org.codehaus.jackson”下,2.x在“com.fasterxml.jackson”下);和注释ObjectMapper
必须匹配。
如果没有调用(de)序列化程序,就会出现这种情况。
但是你确定需要自定义序列化器,解串器吗?为什么不使用ObjectMapper
配置DateFormat
并让它执行此操作?
您还可以配置Jackson是否使用Java时间戳(自1.1.1970以来的毫秒数)或文本格式;我不记得哪一个是默认的。