我正在尝试将一个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。
谷歌搜索对我帮助不大。欢迎任何指针。答案 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对象(在模型中)或扁平的字符串(在一种形式)。呃,好吧!希望这会有所帮助。