Класс Enum не возвращает нужные мне значения

Я создал класс enumerated, который содержит 2 значения. Я хочу создать controller, который возвращает существующие перечисления вместе с их значениями.

Это мой класс Enum:

@Getter
public enum ModesEnum {

   ASSOCIATED ("A", "Associated"), DISASSOCIATED ("D", "Disassociated");

   private String key;
   private String value;

   private ModesEnum(String key, String value) {
       this.key = key;
       this.value = value;
   }

   @JsonValue
   public String getValor() {
       return value;
   }

   @JsonValue
   public String getKey() {
       return key;
   }

   private static final Map<String, String> mapClassEnum;

   static {
       mapClassEnum = new HashMap<>();
       Arrays.stream(values()).forEach(elem -> {
           mapClassEnum.put(elem.getValue(), elem.getKey());
           mapClassEnum.put(elem.getValue(), elem.getValor());
   });
}

Мой класс контроллера:

@GetMapping(value = "/modesEnum")
    public ResponseEntity<ModesEnum[]> getAll(){
        return new ResponseEntity<>(ModesEnum.values(), null, HttpStatus.OK);
    }

однако при выполнении контроллера выдает следующую ошибку:

 Problem with definition of AnnotedClass ModesEnum Multiple 'as-value' properties defined ModesEnum #getKey() vs ModesEnum [0]

Как я могу вернуть в моем controller что-то подобное JSON?:

{
   { key: "A", value : "Associated"},
   { key: "D", value : "Disassociated"}
}

У вас есть два разных поля, помеченных @JsonValue. Разве у вас не должно быть только одно определение как таковое, чтобы гарантировать, что оно станет вашим значением перечисления при десериализации? На это, похоже, указывает сообщение об ошибке.

Edwin Dalorzo 04.10.2022 14:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
155
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В документации JsonValue сказано, что только один метод может быть аннотирован с помощью @JsonValue.

Этой аннотацией можно пометить не более одного метода класса; если найдено более одного, может быть выдано исключение.

Вы можете попытаться сериализовать как key, так и value в методе toString() (аннотировать toString() с помощью @JsonValue).

Другим вариантом может быть использование @JsonProperty в ваших экземплярах перечисления:

@JsonProperty("associated")
ASSOCIATED ("A", "Associated"), 
@JsonProperty("disassociated")
DISASSOCIATED ("D", "Disassociated");

Другие вопросы по теме