Проблема с преобразованием JSON в объектную модель из-за перечисления - PullRequest
0 голосов
/ 12 октября 2018

У меня есть 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
}

Но мы используем перечисления с заглавными буквами, и это хорошее соглашение об именах.

Как я могу подойти к этой проблеме, чтобы иметь возможность получать crewType как String из этого defaultJson и каким-то образом преобразовывать его в CrewType.COCKPIT, если эта строка "Cockpit", и в CrewType.CABIN, если эта строка "Cabin"

1 Ответ

0 голосов
/ 13 октября 2018

Я предполагаю, что объект построен с использованием его (сгенерированных ломком) сеттеров.Так что, если вы добавите еще один установщик, берущий строку и отображающий ее в перечисление, это может сработать.

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
}
...