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

时间:2015-11-02 18:31:14

标签: java jersey jackson

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

POST

然后我会在我的Checkout类中编写自定义setter,它使用Strings而不是Users和Items:

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

但泽西岛从不打电话给我的二传手。用户和项属性都保持为空,我不确定原因。如果这不是使用Jersey / Jackson设置对象的正确方法,那还有什么我应该尝试的吗?

1 个答案:

答案 0 :(得分:3)

您可以使用@JsonDeserialize指定一个构建器类,该类可以保存用于从String转换为User或Item的自定义逻辑:

@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类的每个setter上使用@JsonProperty以及它们如何使用JSON中的属性名称。确保您的JSON结构正确映射到构建器字段非常重要。