当值设置为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;
}
}
}
因此,如果我以{“ name”:“ abc”,“ age”:22}的形式获取JSON,则应将其保存在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());
}
}
}
答案 0 :(得分:2)
我假设根据@JsonProperty
的使用,您正在使用Jackson进行反序列化。杰克逊没有神奇的自动检测建筑商的方法。您必须明确告诉Jackson,它应该使用特定的构建器类来构造实例。
在您的示例中,Jackson只是使用生成的UserEntity
创建了@NoArgsConstructor
的实例。然后,它通过反射来设置字段值(不需要设置器即可)。因此,永远不会使用构建器中的代码。
如果要让Jackson使用生成器反序列化,则必须在UserEntity
之前添加:
@JsonDeserialize(builder = UserEntity.UserEntityBuilder.class)
此外,您必须告诉Jackson建造者中setter方法的命名方式:
@JsonPOJOBuilder(withPrefix = "")
public static class UserEntityBuilder {
...
}
但是,让我注意一下,对于您的用例,这种方法似乎“太多了”。为什么不只向UserEntity
本身添加setter方法,并在其中添加大写字母呢?