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

时间:2018-07-30 13:46:29

标签: lombok

当值设置为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());
        }   
    }
}

1 个答案:

答案 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方法,并在其中添加大写字母呢?