【问题标题】:Invalid definition when using builder to map an object使用构建器映射对象时定义无效
【发布时间】:2020-10-22 15:57:31
【问题描述】:

我正在通过 Rest Template 在 Spring 中进行休息调用。

如果我用来映射的对象使用 Lombok 的 Getter/Setter,一切正常。

但如果我使用 Builder,它会因 InvalidDefinitionException 错误而中断。

如果我按照错误进行操作并添加构造函数,它确实有效。

但我试图避免它。我只是想让这些字段最终化,然后让 builder 来处理构建。

我能否就如何解决这个问题获得一些建议,或者如果这是预期的并且不能简单地坚持使用 Builder 并且确实需要构造函数?谢谢。

以下编译正常,但是当我进行其余调用时,会出现以下错误:

InvalidDefinitionException:无法构造实例 my.package.Genre(不存在创建者,如默认构造函数): 无法从 Object 值反序列化

@Builder
@Getter
public class Genre {
    private long id;
    private String name;
}

其余调用失败

return restTemplate.exchange(url, HttpMethod.GET, entity, Genre.class, params);

使用 Setter 时会通过以下内容。使用上面相同的 rest 调用进行测试。

@Getter
@Setter
public class Genre {
    private long id;
    private String name;
}

或者,如果我添加了试图不做的构造函数,以下方法也可以。

如果这是必须的,我会选择使用 Setter。做建议。

@Builder
@Getter
public class Genre {
    private long id;
    private String name;

    public Genre() {
    }

    public Genre(long id, String name) {
        this.id = id;
        this.name = name;
    }
}

【问题讨论】:

    标签: java spring lombok


    【解决方案1】:

    从 Lombok 1.18.16 开始,您可以使用 @Jacksonized 自动生成 Jackson 使用 Lombok @(Super)Builder 所需的一切:

    @Jacksonized
    @Builder
    @Getter
    public class Genre {
        private final long id;
        private final String name;
    }
    

    对于早期的 Lombok 版本,您必须按如下方式自定义构建器:

    @Builder
    @Getter
    @JsonDeserialize(builder = Genre.GenreBuilder.class)
    public class Genre {
        private final long id;
        private final String name;
    
        @JsonPOJOBuilder(withPrefix = "")
        public static final class GenreBuilder {
        }
    }
    

    【讨论】:

      【解决方案2】:

      这应该可行。

      @Builder
      @Getter
      @NoArgsConstructor
      public class Genre {
          private long id;
          private String name;
      }
      

      TDLR;如果没有定义其他构造函数,@Builder 会隐式创建 all-args-constructor。通常由编译器自动添加的 no-arg-constructor 不会被添加。在这种情况下,RestTemplate 需要 no-arg-constructor。所以我们添加一个。

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        相关资源
        最近更新 更多