如何创建自定义 setter 以在 Jersey/Jackson 中设置对象?

How can I create a custom setter for setting objects in Jersey/Jackson?

我有一个名为 Checkout 的实体,它有一个用户和一个项目。所以当用户想要创建一个新的结帐对象时,他们 POST 到“/checkout”。现在,我正在考虑设置用户和项目,用户将改为包含用户名和序列号,例如:

{
    "id": "1",
    "user": "hassan",
    "item": "sdf2ljt234jt09jsd"
}

然后我会在我的 Checkout class 中编写自定义 setters,它采用字符串而不是用户和项目:

public void setUser(String username) {
    this.user = ...
}

但是 Jersey 从来没有给我打电话 setter。用户和项目属性都为空,我不确定为什么。如果这不是使用 Jersey/Jackson 设置对象的正确方法,还有什么我应该尝试的吗?

您可以使用 @JsonDeserialize 来指定构建器 class,它可以保存从字符串到用户或项目的自定义逻辑:

@JsonDeserialize(builder = Checkout.Builder.class)
public class Checkout {
    private Long id;
    private User user;
    private Item item;

    // getters and setters

    public static class Builder {
        private Long id;
        private String username;
        private String serialNumber;

        @JsonProperty("id")
        public Builder setId(Long id) {
            this.id = id;
            return this;
        }

        @JsonProperty("user")
        public Builder setUsername(String username) {
            this.username = username;
            return this;
        }

        @JsonProperty("item")
        public Builder setSerialNumber(String serialNumber) {
            this.serialNumber = serialNumber;
            return this;
        }

        public Checkout build() {
            Checkout checkout = new Checkout();
            checkout.setId(id);
            checkout.setUser(/* lookup user by username */);
            checkout.setItem(/* lookup item by serialNumber */);
            return checkout;
        }
    }
}

请注意在 Builder class 的每个设置器上使用 @JsonProperty 以及它们如何使用您的 JSON 中的属性名称。这对于确保您的 JSON 结构正确映射到构建器字段很重要。