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

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

我有这个代码:

@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

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

谢谢!

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

这里有一个例子

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

此代码的问题在于,当您保存数据时没有出现错误。 那么当你检索数据时, (正如 Zsolt V 解释的那样)java 尝试再次构建该数据, 但是因为那个对象的类型是一个接口,java 不能决定它是什么类型的集合(它可以是 HashSet,LinkedHashSet 等等)

一个简单的解决方案是像这样使用 HashSet 而不是 Set

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

我在尝试保存密钥对象形式 Spring 安全包时遇到了这个问题,它是和接口

祝编码人员好运。

保持堆栈流动:D