无法使用带参数的构造函数NO_CONSTRUCTOR实例化java.util.Set

时间:2017-09-14 15:50:33

标签: java spring mongodb lombok

我有这段代码:

@NoArgsConstructor
public class localizedInformations implements Serializable {

    @Getter
    @JsonProperty("infos")
    private Map<String, Set<Info>> localizedInfos = new HashMap<>();
}

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TechnicalInfo implements Serializable {

    private static final long serialVersionUID = -8926217088092761683L;

    private String label;

    private List<String> values;
}

在我执行findAll mongo操作时执行的某个时刻,我收到此错误:

Failed to instantiate java.util.Set using constructor NO_CONSTRUCTOR with arguments

你能看出问题出在哪里吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

当您从数据库调用localizedInformations的实例时,您的工具会尝试根据从数据库收集的数据和您的类定义的结构来构建它。您编写了Set,并且该进程将尝试实例化一个Set(这是不可能的,因为它是一个接口),并且该过程不会尝试猜测您想要使用哪种实际实现。因此,您应该为您的成员指定一个实际的Set实现。

答案 1 :(得分:0)

这是一个例子

private Map<String, Set<Info>> localizedInfos = new HashMap<>();

此代码的问题在于,当您保存数据时不会出现错误。 然后当您检索数据时, (如Zsolt V所述)java尝试再次构建该数据, 但是由于该对象的类型是接口,因此Java无法确定它是哪种Set(可以是HashSet,LinkedHashSet等)。

一种简单的解决方案是您使用HashSet代替Set这样

private Map<String, HashSet<Info>> localizedInfos = new HashMap<>();

当我尝试从Spring安全软件包中保存一个Key对象时,我遇到了这个问题,它是和接口

好运编码专家。

保持堆栈流动:D