如何创建自定义 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 结构正确映射到构建器字段很重要。
我有一个名为 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 结构正确映射到构建器字段很重要。