Java 使用生成器映射对象时定义无效

Java 使用生成器映射对象时定义无效,java,spring,lombok,Java,Spring,Lombok,我正在通过rest模板在Spring中进行rest调用 如果我用来映射的对象使用Lombok的Getter/Setter,那么一切都正常 但是如果我使用一个构建器,它会因为一个InvalidDefinitionException错误而中断 如果我按照错误添加构造函数,它就可以工作了 但我正在努力避免它。我只是想让这些场地最终完工,让建筑商来处理施工 我可以得到一些建议,我可以如何绕过这个问题,或者如果这是预期的,不能简单地坚持使用只是建设者,确实需要建设者?谢谢 以下编译很好,但当我进行rest

我正在通过rest模板在Spring中进行rest调用

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

但是如果我使用一个构建器,它会因为一个InvalidDefinitionException错误而中断

如果我按照错误添加构造函数,它就可以工作了

但我正在努力避免它。我只是想让这些场地最终完工,让建筑商来处理施工

我可以得到一些建议,我可以如何绕过这个问题,或者如果这是预期的,不能简单地坚持使用只是建设者,确实需要建设者?谢谢

以下编译很好,但当我进行rest调用时,会出现以下错误:

InvalidDefinitionException:无法构造的实例
my.package.Genre
(不存在像默认构造函数这样的创建者): 无法从对象值反序列化

失败的rest调用

return restTemplate.exchange(url, HttpMethod.GET, entity, Genre.class, params);
使用Setter时将通过以下步骤。使用上面相同的rest调用进行测试

@Getter
@Setter
public class Genre {
    private long id;
    private String name;
}
或者,如果我添加了构造函数,那么下面的方法也会起作用

如果这是必须的,我会选择坚持二传。做建议

@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;
    }
}
这应该行得通

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

TDLR@如果没有定义其他构造函数,则生成器隐式创建所有args构造函数。不会添加通常由编译器自动添加的参数构造函数。在这种情况下,RestTemplate不需要-arg-constructor。因此我们添加了一个。

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

@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 {
    }
}
@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 {
    }
}