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

尽管至少存在一个创建者,但无法构造类的实例

汪飞捷
2023-03-14

当用Jackson反序列化LocationGeneric时,我在Kotlin中遇到了以下问题。在这种情况下,我没有向用于构造具体类的抽象类添加额外信息。当我反序列化位置一或位置二时,它工作得很好。

这是我写的代码:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, 
        property = "type", visible = true)
@JsonSubTypes(
        JsonSubTypes.Type(value = LocationOne::class, name = "ONE"),
        JsonSubTypes.Type(value = LocationTwo::class, name = "TWO"),
        JsonSubTypes.Type(value = LocationGeneric::class, name = "GENERIC_1"),
        JsonSubTypes.Type(value = LocationGeneric::class, name = "GENERIC_2")
)
abstract class Location(
        val type: String
)

class LocationGeneric(
        type: String
): Location(type)

class LocationOne(
        type: String,
        val somethingSpecific: String
): Location(type)

class LocationAirport(
        type: String,
        val somethingElse: String
): Location(type)

这是我遇到的错误:

无法构造位置的实例(尽管至少存在一个Creator):无法从Object值反序列化(没有基于委托或属性的Creator)

我尝试将抽象类更改为开放类,但到目前为止没有成功。我为其他案件工作。为什么它在LocationGeneric中找不到默认的Kotlin构造函数?有什么想法吗?

共有1个答案

仲孙磊
2023-03-14

我遇到的问题是,我不知何故失去了构造函数的可见性,所以我为泛型案例提供了一个默认实现,并注释了我的泛型实现的构造函数和属性。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY,
        property = "type", visible = true, defaultImpl = LocationGeneric::class)
@JsonSubTypes(
        JsonSubTypes.Type(value = LocationOne::class, name = "ONE"),
        JsonSubTypes.Type(value = LocationTwo::class, name = "TWO")
)
abstract class Location(
        val type: String
)

class LocationGeneric @JsonCreator constructor(
        @JsonProperty("type") type: String
): Location(type)

这还允许我添加一个init来处理奇怪的映射情况。

 类似资料:
  • 我正在使用以下DTO: 和 我调用了一个REST web服务,并从Postman那里看到我(正确地)收到了以下响应: 附言。1)我还有其他扩展BasicResponseDTO的DTO,反序列化对它们很有效。 附言。2)在服务器和客户端上,类的定义是相同的。

  • 我有以下课 映射时 “workpoolId”:1 到这个班我得到一个 javax.ws.rs.ProcessingException:com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造的实例(尽管至少存在一个Creator):没有int/Int-参数构造函数/工厂方法从数字值反序列化(1) 为什么jackson不能对数值

  • 我有以下简单的jUnit测试: 不幸的是,在运行时,测试会抛出一个不匹配的PutException,并显示以下消息: 这里公认的答案似乎暗示一个人需要一个全参数构造函数。我显然有一个。我还通过使的构造函数尝试了相同的单元测试,并且我还将更改为,确保我还更新了我正在解析的从到。抛出相同的。 关于我做错了什么的想法?

  • 问题内容: 我正在使用JAX-RS 1.0学习Jackson。服务器返回HTTP响应,如下所示: 并且我需要将JSON响应反序列化为Java对象: 在我的测试中,它无法构造对象: 客户端错误是: 无法构造(没有创建者,例如默认构造的实例)的实例:没有要从字符串值反序列化的字符串参数构造函数/工厂方法(‘2018-05-26T09:21:26.301 + 02:00’) 在服务器端,我配置了JSON

  • 我正在JAX-RS 1.0下学习Jackson。服务器返回HTTP响应,如下所示: 我需要反序列化JSON响应到一个Java对象称为: 在我的测试中,它未能构造对象: 客户端错误是: 无法构造(不存在像默认构造那样的创建者):没有字符串参数构造函数/工厂方法从字符串值反序列化('2018-05-26T09:21:26.301 02:00')) 在服务器端,我配置了JSON映射器(但对我的测试没有影

  • 参加以下课程: 由于Foo(std::stringbar_, intbaz_=7);是我唯一的构造函数,编译器不应该为我实现默认构造函数,对吗?我认为我可以构造这个类的唯一两种方法是: 然而,为什么这是可能的? 当唯一的公共构造函数要求其第一个参数具有值时,我不理解如何默认构造类。将默认构造函数设为私有或尝试C 11删除它,没有什么区别。这是怎么发生的 http://ideone.com/CL7I