REST Web服务不使用我的JsonSerializer

时间:2013-09-12 11:28:37

标签: java json serialization jersey jackson

我使用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>

1 个答案:

答案 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以来的毫秒数)或文本格式;我不记得哪一个是默认的。