Lombok@Builder不适用于Entity类中字段的自定义实现



当值设置为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"中的值为大写-

|姓名|年龄|

ABC 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,它应该使用特定的构建器类来构建实例。

在您的示例中,Jackson只是用生成的@NoArgsConstructor创建了一个UserEntity的实例。然后,它通过反射设置字段值(不需要设置器(。所以构建器中的代码永远不会被使用。

如果您希望Jackson使用构建器进行反序列化,则必须在UserEntity:之前添加它

@JsonDeserialize(builder = UserEntity.UserEntityBuilder.class)

此外,您必须告诉Jackson构建器中的setter方法是如何命名的:

@JsonPOJOBuilder(withPrefix = "")
public static class UserEntityBuilder {
...
}

然而,让我注意到,对于您的用例来说,这种方法似乎有点"太多"了。为什么不将setter方法添加到UserEntity本身中,并在这些方法中使用大写字母呢?

最新更新