将java.util.Date数组发布到RestEasy服务

将java.util.Date数组发布到RestEasy服务,java,arrays,jackson,resteasy,json-deserialization,Java,Arrays,Jackson,Resteasy,Json Deserialization,我正在尝试向我的REST服务发送一个日期对象数组java.util.Date。我不断得到以下错误: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.Date[] out of VALUE_STRING token at [Source: wt.servlet.ServletRequestMonitor$CountingInputStream@3a03e75d; li

我正在尝试向我的REST服务发送一个日期对象数组java.util.Date。我不断得到以下错误:

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.Date[] 
out of VALUE_STRING token
at [Source: wt.servlet.ServletRequestMonitor$CountingInputStream@3a03e75d; line: 1, column: 1]
以下是我的方法的原型:

@POST
@Path("/invitations/{userId}/{inviteeId}")
public Response updateDelegations(@PathParam("userId") String userId, 
        @PathParam("inviteeId") String delegateeId, Date[] invitedOnDates) throws Exception
{
    // more code to process this request
}
以下是正在发送的json:

{
   "invitedOnDates":["2014-08-05T00:00:00.000Z","2014-08-06T00:00:00.000Z","2014-08-07T00:00:00.000Z"]
}
我还尝试发布一个字符串数组,即使这会导致相同的JsonMappingException


谷歌搜索对我帮助不大。欢迎任何人指点

按原样发布日期对象不是个好主意。行不通。使用转换器/序列化程序将日期转换为字符串,最好使用DateFormatter,然后作为字符串发送并在另一端转换回来。

如果可以,我建议使用Resteasy的Java 8日期插件JSR-310。您可以使用年-月-日格式的字符串,也可以使用表示数字的数组,例如使用定义了以下不可变值对象的小型演示应用程序

class Person {
    private final UUID id;
    private final String lastName;
    private final String firstName;
    private final String middleNames;
    private final LocalDate dateOfBirth;

    @JsonCreator
    public Peron(
            @JsonProperty("id") UUID id,
            @JsonProperty("lastName") String lastName,
            @JsonProperty("firstName") String firstName,
            @JsonProperty("middleNames") String middleNames,
            @JsonProperty("dateOfBirth") LocalDate dateOfBirth) {
        this.id = id;
        this.lastName = lastName;
        this.firstName = firstName;
        this.middleNames = middleNames;
        this.dateOfBirth = dateOfBirth;
    }
    // getter ceremony omitted
}
像这样的控制器/资源

@Path("/api")
public class PersonResource {
    @POST
    @Path("/person")
    @Consumes(APPLICATION_JSON)
    @Produces(APPLICATION_JSON)
    public Person addPerson(Person person) {
        // do something with new person
    }
}
然后,以下两种日期格式的卷发都可以很好地工作:

curl -v -H 'Content-Type:application/json' -d '{"dateOfBirth":[2009,12,15]}' \
   http://localhost:8000/api/person

curl -v -H 'Content-Type:application/json' -d '{"dateOfBirth":"2009-12-15"}' \
   http://localhost:8000/api/person

我发现的主要问题是,日期的序列化导致了这个数组[year,month,day],在JS端,我不得不将它打包到模型中的JS Date对象或表单中的平面字符串中。好吧!希望这有帮助。

您至少应该发布您正在发送的JSON。另外,请阅读抱歉-更新了正在发送的包含json的帖子。您阅读了我发布的链接了吗?它说,默认情况下,日期被序列化为数字,并解释了如何配置Jackson以指定日期格式。我现在就看一下。我得到的另一个建议是将Date对象包装在一个类中,比如DateItem作为字符串或历元长的值,并传递DateItem数组。听起来有点迂回。感谢@JB Nizet提供文档链接。通过将日期包装到类中,然后对date属性使用自定义序列化程序@JsonSerializeusing=JsonDateSerializer.class,成功解决了此问题。