有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

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

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

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

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

InvalidDefinitionException: Cannot construct instance of my.package.Genre (no Creators, like default constructor, exist): cannot deserialize from Object value

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

失败的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;
    }
}

共 (2) 个答案

  1. # 1 楼答案

    这应该行得通

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

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

  2. # 2 楼答案

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