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

使用Spring Boot JPA反序列化JSON类Kotlin的问题

邢同
2023-03-14

出现的错误日志:

JSON分析错误:无法构造com.lp3bmobi.paintcar_workshop_api.model.vehicletype的实例(尽管至少存在一个创建者):没有可从Number值(3)反序列化的int/Int-argument构造函数/工厂方法

车辆类型类别

@Entity
@Table(name="vehicle_types")
@EntityListeners(AuditingEntityListener::class)
@JsonDeserialize
data class VehicleType (
        @NotBlank
        @Column(name = "type_name")
        var typeName: String ?= null
        //@JsonProperty("typeName") var typeName: String ?= null
) {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    var id: Long ?= null
    //@JsonProperty("id") var id: Long = 0

    constructor(id: Long, typeName: String?): this(typeName) {
        this.id = id
    }

   //    @JsonCreator constructor(id: Long, typeName: String?): this(typeName) {
   //        this.id = id
   //    }

}
@Entity
@Table(name="vehicles")
@EntityListeners(AuditingEntityListener::class)
data class Vehicle (
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        var id: Long ?= null,

        @NotBlank
        @Column(name = "model_name")
        var modelName: String ?= null,

        @NotBlank
        @Column(name = "year")
        var year: Int ?= null,

        @NotBlank
        @Column(name = "brand_id")
        var brand: Int ?= null,

        @NotBlank
        @Column(name = "description")
        var description: String ?= null,

        @NotBlank
        @Column(name = "approved")
        var approved: Boolean ?= null,

        @OneToOne(fetch = FetchType.LAZY) //cascade = arrayOf(CascadeType.ALL)
        @JoinColumn(name = "vehicle_type_id", referencedColumnName = "id")
        var vehicleType: VehicleType,
        //@JsonProperty("vehicleType") var vehicleType: VehicleType ?= null,
)

车辆控制

@PostMapping("/vehicle/new")
fun createVehicle(@RequestBody vehicle: Vehicle): ResponseEntity<Vehicle?>? { //EntityModel<Vehicle>
        try {
          val _vehicle: Vehicle = vehicleRepository
                  //.save(Vehicle(vehicle.content))
                 //.save(Vehicle(0, vehicle.modelName, vehicle.year, vehicle.brand,
                //              vehicle.description, false, vehicle.vehicleType))
                .save(vehicle)
           return ResponseEntity<Vehicle?>(_vehicle, HttpStatus.CREATED)
       } catch (e: java.lang.Exception) {
           return ResponseEntity<Vehicle?>(null, HttpStatus.INTERNAL_SERVER_ERROR)
    }
}

共有1个答案

锺离高丽
2023-03-14

错误消息似乎是说Spring找不到vehicletype使用单个Int参数的构造函数,所以显而易见的是给它一个!

您可以通过添加另一个辅助构造函数来实现:

constructor(id: Int): this(null) {
    this.id = id.toLong()
}

(免责声明:我自己还没试过…… ,如果有用请告诉我们!)

 类似资料:
  • 试图将JSON反序列化为我创建的Java bean。对杰克逊和这项努力来说真的很新鲜,所以请容忍我。我有以下几点: 由于JSON中的对象被反复使用,我的Java Bean被分解为几个部分,因此: ...和以类似方式实现的另一个BlockBean类(为简洁起见省略)。我使用杰克逊来完成这个任务,我的问题是——杰克逊中是否有序列化和反序列化的机制?理想情况下,我想要这样的东西(下面是伪代码,因为我无法

  • 问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。

  • 对于某些用例,我需要将一个POJO转换为另一个具有不同字段名称的POJO。我试着使用Jackson对象映射器。它在某些方面起了作用。然而,最终的结果并不是我所期望的。 如果运行,输出将是: SOUT:UserMap{name_new='Deepak',meta=address::Singapore,id::111} 杰克逊:{“姓名”:“迪帕克”,“地址”:“新加坡”,“身份证”:“111”} 我

  • 在Android应用程序中,我需要用一个抽象级别反序列化Kotlin数据类的Json数据。但我不知道如何在构造函数中放置正确的属性。 简单来说,假设我有一个形状: 有两个派生 和 所以我的目标是,不要实例化一个形状。所以,相反,总是反序列化它的派生。稍后,我需要处理其他类中的一些集合属性,如: 但我还必须知道每个元素的派生类型。 当我尝试用Gson反序列化给定的示例时 我总是有一个非法的辩论例外

  • 问题内容: 可以说我有以下格式的JSON: 我试图避免自定义反序列化器,并尝试将上述JSON(称为Wrapper.java)反序列化为Java POJO。“类型”字段指示“对象”反序列化,即。type = foo表示使用Foo.java反序列化“ object”字段。(如果type = Bar,则使用Bar.java反序列化对象字段)。元数据/所有者将始终使用相同的反序列化方式,每个方法都使用一个

  • 问题内容: 我在这里发现了同样的问题… …但是没有正确的答案。 最好的建议之一是将嵌套对象包装到新类中,但是这种方法引入了另一个问题:乐高名称。 在我的示例中,此类的最逻辑名称是与父类相同的名称,当然这是不可能的。我的示例很简单,我只想消除父类中的“语言”属性。有人可以帮我做吗? json的示例: 问题答案: 如果JSON属性名称与c#命名约定冲突,则可以在序列化期间使用或批注替换其他名称。 例如