Jackson does not use setter



我知道过去有人提出过这种问题,但不是完全相同的问题,所以我觉得有权利问这个问题。

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

最新更新