json - 由于 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?
解决方案
我猜这个对象是使用它的(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
}
推荐阅读
- sqlite - 安装cordova-sqlite-storage时出错
- qt - QML:计算Y位置时的绑定循环
- python - 无法在 Ubuntu 16.04.5 中安装 geograpy python 包
- mysql - 每次更新后将所有字段更新到日记帐表
- reactjs - 对状态和事件值求和
- excel - excel中的子查询?如何将一行的分类添加到具有相同 ID 的其他行?
- android - arraymap 比稀疏数组更好地记住从 JSON 文件中捕获的一些数据?
- node.js - 如何连接两个表?- 无法读取未定义的属性“getTableName”
- codenameone - CN1如何让Toolbar覆盖?
- php - 如何使用 Symfony 和 TranslatorInterface 翻译描述命令?