首页 > 解决方案 > 由于 enum-groovy 将 json 转换为对象模型的问题

问题描述

我有一个 defaultJson.json:

{
  "crewType": "Cockpit",
  "status": "CREATED",
  "usePoints": true,
  "points": [
    {
      "rank": "CPT",
      "defaultPoints": 0,
      "carryForwardPointsAllowed": false,
      "carryForwardPointsMax": null,
      "negativePointsAllowed": false,
      "negativePointsLimit": null,
      "accrualExpirationValue": null,
      "accrualExpirationUnit": null
    }
  ]
}

我为此 json 创建了一个模型,以便能够从中创建对象:

package com.xxxx.models

import lombok.AllArgsConstructor
import lombok.Builder
import lombok.Data
import lombok.NoArgsConstructor

@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
class SomeConfig {
    private Long version
    private CrewType crewType
    private ConfigStatus status
    private String modifiedBy
    private String modifiedTimestamp
    private List<String> leaveTypes
    private boolean usePoints
    private List<PointsConfig> points
}

@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
class PointsConfig {
    private String rank
    private int defaultPoints
    private boolean carryForwardPointsAllowed
    private Integer carryForwardPointsMax
    private boolean negativePointsAllowed
    private Integer negativePointsLimit
    private Integer accuralValue
    private AccrualUnit accuralUnit
}

enum ConfigStatus {
    DRAFT,
    CREATED
}

enum AccrualUnit {
    DAY,
    MONTH
}

enum CrewType {
    CABIN("Cabin"),
    COCKPIT("Cockpit"),
    final String value

    CrewType(String value) {
        this.value = value
    }
}

所以我想创建“SomeConfig”模型的对象并能够修改该对象内的对象。问题是它不起作用。

当我尝试以这种方式创建此对象时:

SomeConfig someConfig = new SomeConfig(DataSource.getTestData(defaultJson.json)

我收到此错误消息:

java.lang.IllegalArgumentException: No enum constant 
com.xxxx.models.CrewType.Cockpit

    at java.lang.Enum.valueOf(Enum.java:238)
    at com.xxxx....

如果我打破命名约定并像这样进行枚举,它将起作用:

enum CrewType {
    Cabin,
    Cockpit
}

但是我们使用带有大写字母的枚举,这是一个很好的命名约定。

如果这个字符串是“Cockpit”,我该如何解决这个问题,以便能够从这个 defaultJson 接收 crewType 作为 String 并以某种方式将其转换为 CrewType.COCKPIT,如果这个字符串是“Cabin”,则转换为 CrewType.CABIN?

标签: jsongroovyspock

解决方案


我猜这个对象是使用它的(Lomok 生成的)setter 构造的。因此,如果您添加另一个获取字符串并将其映射到枚举的 setter,那可能会起作用。

public void setCrewType(final String crewTypeValue) {
    CrewType crewType = CrewType.values().find { it.value == crewTypeValue }
    If (!crewType) throw new IllegalArgumentException("Invalid crew type ${crewTypeValue}")
    this.crewType = crewType
}

推荐阅读