当前位置: 首页 > 知识库问答 >
问题:

使用生成器方法作为构造函数反序列化外部库类[重复]

冯宏浚
2023-03-14

我有一堂这样的课:

class MyClass {
    CustomList<String> list = ListUtils.createCustomList();
}

其中接口CustomList实现了java.util.List,因此无法使用构造函数对其进行反序列化。相反,有一个类ListUtils可以创建一个实现实例。接口和实用程序类都在外部库中,因此我无法注释它们。

我如何告诉Jackson,当遇到CustomList时,它应该调用ListUtils.createCustomList()而不是构造函数?是否有混音配置,我可以指定从类型到构造方法的映射,或者我需要编写的自定义反序列化器?

共有1个答案

胡沈义
2023-03-14

这里有两个问题,第一个问题是如何告诉Jackson使用另一个类的静态方法来创建CustomList类的实例。有一个JsonCreator,你可以在CustomList的静态方法上使用,也可以通过mix-in使用。不幸的是,您不能在ListUtils上使用它。这是一个悬而未决的问题。

在实现/释放上述请求之前,您必须创建自定义反序列化器。这种反序列化器的框架实现如下所示:

class ListDeserializer extends JsonDeserializer<CustomList> {
    @Override
    public CustomList deserialize(JsonParser p, DeserializationContext c) throws IOException {
        return ListUtils.createCustomList();
    }
}

使用其他初始化步骤扩展此方法,例如使用JsonParser解析元素并在返回之前将它们添加到列表中。请参阅此处的示例。您可以在ObjectMapper上指定此反序列化程序以在没有任何注释的情况下使用:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(CustomList.class, new ListDeserializer());
mapper.registerModule(module);
 类似资料:
  • 问题内容: 我正在尝试使用Jackson 1.9.10反序列化此类的实例: 当我尝试这个我得到以下 冲突的基于属性的创建者:已经有… {界面org.codehaus.jackson.annotate.JsonCreator @ org.codehaus.jackson.annotate.JsonCreator()}],遇到了…,注释:{接口org.codehaus。 jackson.annotat

  • 我正在编写一个库来访问用于管理后端系统中数据的网络应用编程接口。该库还将为类提供正确管理数据的逻辑。由于这个原因,大多数类不能有属性的公共设置器或接受所有属性的公共构造函数。相反,我试图使用一个具有内部访问修饰符的构造函数,它可以设置所有属性。 当试图使用System反序列化JSON字符串时。文本。json它将忽略内部构造函数-它将使用其他构造函数或抛出异常。我还尝试用注释内部构造函数,但它什么也

  • 我在我的项目中使用FasterXML/Jackson Databind已经有一段时间了,一切都很顺利,直到我发现这篇文章并开始使用这种方法对没有@JsonProperty注释的对象进行序列化。 问题是,当我有一个接受多个参数并使用@JsonCreator注释装饰这个构造函数时,Jackson会抛出以下错误: 我已经创建了一个小项目来说明这个问题,我试图对这个类进行序列化: 反序列化代码如下: 我已

  • 正在尝试从spring boot接收页面进行单元测试。如果与javascript一起使用,该页面可以很容易地进行反序列化,但是使用java,它会失败。已经为spring添加了一个默认构造函数(这是另一篇stackoverflow文章中接受的答案),但它在这里不起作用。 单元测试 再培训班 "' 代码在github上可用-- 反序列化引发以下错误:

  • 将这些注释应用于mixin没有任何效果。 我发现唯一有效的方法是利用创建的包访问AllArgsConstructor,并用以下构造函数填充mixin 这显然是不可取的,因为它需要显式地迭代和硬编码每个类属性,使得mixin对外部POJO中的任何更改都很脆弱。

  • 操作步骤: 菜单栏: Code —> Generate —> Constructor 快捷键: Mac: command + N Windows\/Linux: Alt + Insert —> Constructor