当值设置为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
本身中,并在这些方法中使用大写字母呢?