我知道过去有人提出过这种问题,但不是完全相同的问题,所以我觉得有权利问这个问题。
我正在使用JERSEY与JACKSON一起用于REST web服务(JAVA 1.8_011 + Tomcat v7.0 + windows 7 + JERSEY-common 2.23.2 + JACKSON 2.8.2)
我的一个POJO字段有以下setter:
public void setEndDate(LocalDateTime endDate) {
if (this.startDate != null && this.startDate.isAfter(endDate))
{
throw new IllegalArgumentException("Start date must to be before End date");
}
this.endDate = endDate;
}
我的web服务如下:
@PUT
@Path("/updateCoupon")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String updateCoupon(Coupon coupon) {
try
{
//Coupon tmpCoupon = new Coupon(coupon);
System.out.println("*" + coupon.getEndDate().toString() + "*");
getFacade().updateCoupon(coupon);
return "ok";
}
catch (FacadeException | IllegalArgumentException e)
{
return e.getMessage();
}
}
JSON: {
"startDate":"2016-11-04T00:00",
"endDate":"2016-11-09T00:00",
"amount":7,
"id":143,
"image":"390_290_5cc10a4d-9a3f-4cfc-8.jpg",
"message":"gfd",
"price":3.34,
"title":"n37",
"type":"HEALTH"
}
调试和测试后的问题是,JSON不使用我的setter转换从JSON到POJO(它发生在更多的setter,所以setter本身不是问题)
谢谢
当前的Coupon代码取决于调用setter的顺序。如果在setStartDate之前调用setEndDate,则setEndDate中的验证实际上不能使用startDate字段。
要解决这个问题,您可以:
- 从bean中删除setter并转换为使用执行验证逻辑的构造函数进行初始化
- 使用静态工厂方法并将其标记为
@JsonCreator
,以便Jackson将使用该方法而不是构造函数 - 以上两者的结合
- 切换到某种bean对象创建器,它允许您创建一个检查方法,以便在调用所有setter后运行(本质上是第二个选项的自动版本),例如Immutables或FreeBuilder