Lombok @Builder 不适用于实体中字段的自定义实现 class
Lombok @Builder not working for a custom implementation of a field in Entity class
设置String类型字段时,我想把值大写。我正在使用带有自定义生成器的 lombok @Builder 来执行此操作。但是,没有得到想要的结果!代码如下-
@Table(value = “user_table”)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserEntity {
@JsonProperty(“name") private String name;
@JsonProperty(“age”) private Integer age;
public static class UserEntityBuilder {
public UserEntityBuilder name(String name) {
this.name = StringUtils.upperCase(name);
return this;
}
}
}
所以,如果我得到 JSON 作为 {"name":"abc", "age":22},这应该保留在 user_table 中下面,'name'中的值是大写的-
|姓名 |年龄 |
美国广播公司 22
但值另存为
|姓名 |年龄 |
abc 22
|解决方案 1|
@Table(value = “user_table”)
@Data
@NoArgsConstructor
public class UserEntity {
private String name;
@JsonProperty(“age”) private Integer age;
@JsonSetter("name")
public void setName(String name) {
this.name = StringUtils.upperCase(name);
}
}
|解决方案 2|
@Table(value = “user_table”)
@Data
@NoArgsConstructor
public class UserEntity {
@JsonProperty(“name”)
@JsonDeserialize(using = NameDeserializer.class)
private String name;
@JsonProperty(“age”) private Integer age;
public static class NameDeserializer
extends StdDeserializer<String> {
private static final long serialVersionUID = 1L;
public NameDeserializer() { this(null); }
public NameDeserializer(Class<?> vc) { super(vc); }
@Override
public String deserialize(
JsonParser p,
DeserializationContext ctxt
) throws IOException, JsonProcessingException {
return StringUtils.upperCase(p.getText());
}
}
}
我根据 @JsonProperty
的用法假设您正在使用 Jackson 进行反序列化。杰克逊没有神奇的自动检测建造者的功能。您必须明确告诉 Jackson 它应该使用特定的构建器 class 来构建实例。
在您的示例中,Jackson 只是使用生成的 @NoArgsConstructor
创建了一个 UserEntity
的实例。然后它通过反射设置字段值(这样做不需要 setters)。所以你在构建器中的代码永远不会被使用。
如果你想让Jackson使用构建器反序列化,你必须在UserEntity
之前添加:
@JsonDeserialize(builder = UserEntity.UserEntityBuilder.class)
此外,你必须告诉 Jackson 构建器中的 setter 方法是如何命名的:
@JsonPOJOBuilder(withPrefix = "")
public static class UserEntityBuilder {
...
}
但是,请注意,对于您的用例,这种方法似乎有点 "too much"。为什么不直接将 setter 方法添加到 UserEntity
本身并在其中做大写?
设置String类型字段时,我想把值大写。我正在使用带有自定义生成器的 lombok @Builder 来执行此操作。但是,没有得到想要的结果!代码如下-
@Table(value = “user_table”)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserEntity {
@JsonProperty(“name") private String name;
@JsonProperty(“age”) private Integer age;
public static class UserEntityBuilder {
public UserEntityBuilder name(String name) {
this.name = StringUtils.upperCase(name);
return this;
}
}
}
所以,如果我得到 JSON 作为 {"name":"abc", "age":22},这应该保留在 user_table 中下面,'name'中的值是大写的-
|姓名 |年龄 |
美国广播公司 22
但值另存为
|姓名 |年龄 |
abc 22
|解决方案 1|
@Table(value = “user_table”)
@Data
@NoArgsConstructor
public class UserEntity {
private String name;
@JsonProperty(“age”) private Integer age;
@JsonSetter("name")
public void setName(String name) {
this.name = StringUtils.upperCase(name);
}
}
|解决方案 2|
@Table(value = “user_table”)
@Data
@NoArgsConstructor
public class UserEntity {
@JsonProperty(“name”)
@JsonDeserialize(using = NameDeserializer.class)
private String name;
@JsonProperty(“age”) private Integer age;
public static class NameDeserializer
extends StdDeserializer<String> {
private static final long serialVersionUID = 1L;
public NameDeserializer() { this(null); }
public NameDeserializer(Class<?> vc) { super(vc); }
@Override
public String deserialize(
JsonParser p,
DeserializationContext ctxt
) throws IOException, JsonProcessingException {
return StringUtils.upperCase(p.getText());
}
}
}
我根据 @JsonProperty
的用法假设您正在使用 Jackson 进行反序列化。杰克逊没有神奇的自动检测建造者的功能。您必须明确告诉 Jackson 它应该使用特定的构建器 class 来构建实例。
在您的示例中,Jackson 只是使用生成的 @NoArgsConstructor
创建了一个 UserEntity
的实例。然后它通过反射设置字段值(这样做不需要 setters)。所以你在构建器中的代码永远不会被使用。
如果你想让Jackson使用构建器反序列化,你必须在UserEntity
之前添加:
@JsonDeserialize(builder = UserEntity.UserEntityBuilder.class)
此外,你必须告诉 Jackson 构建器中的 setter 方法是如何命名的:
@JsonPOJOBuilder(withPrefix = "")
public static class UserEntityBuilder {
...
}
但是,请注意,对于您的用例,这种方法似乎有点 "too much"。为什么不直接将 setter 方法添加到 UserEntity
本身并在其中做大写?