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

时间:2014-08-23 17:13:22

标签: java arrays jackson resteasy json-deserialization

我正在尝试将一个Date对象数组(java.util.Date)发送到我的REST服务。我一直收到以下错误:

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"]
}

我也试过发布一个String数组,甚至导致相同的JsonMappingException。

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

2 个答案:

答案 0 :(得分:0)

按原样发布Date对象不是一个好主意。不会工作。使用变换器/序列化器将Date转换为字符串,最好使用DateFormatter,然后发送为String并转换回另一端。

答案 1 :(得分:0)

如果可以的话,我建议使用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

我发现的主要烦恼是日期的序列化导致这个数组[年,月,日],在JS方面我最终必须打包到JS Date对象(在模型中)或扁平的字符串(在一种形式)。呃,好吧!希望这会有所帮助。