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 本身并在其中做大写?