Как отправить данные перечисления внутри объекта запроса

#spring-boot

Вопрос:

Я создал перечисление, подобное приведенному ниже, для хранения статического выпадающего значения.

  @JsonFormat(shape = JsonFormat.Shape.OBJECT)
    public enum Days {
        MONDAY(1,"Monday"), TUESDAY(2,"Tuesday"),THURSDAY(4,"Thursday"), FRIDAY(5,"Friday"), SATURDAY(6,"Saturday"), 
        SUNDAY(7,"Sunday");
        
        private final Integer key;
        private final String value;
    
        Days(Integer key, String value) {
            this.key = key;
            this.value = value;
        }
    
        public Integer getKey() {
            return key;
        }
    
        public String getValue() {
            return value;
        }
    }
 

Я написал нижеприведенную конечную точку для перечисления данных перечисления в качестве ответа JSON

 @GetMapping("/getenums")
    public List<Days> getenums() {
        return Arrays.asList(Days.values());
    }
 

что приводит к массиву объектов JSON, как показано ниже

  [{"key":1,"value":"Monday"},{"key":2,"value":"Tuesday"},{"key":4,"value":"Thursday"},{"key":5,"value":"Friday"},{"key":6,"value":"Saturday"},{"key":7,"value":"Sunday"}]
 

У меня есть пример домена, как показано ниже

  public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long userId;
        private String name;
        private Days day;
        private Month month;
    }
 

Ниже приведен мой контроллер,

 @PostMapping("/user")
  public User createInstructor(@RequestBody User user) {        
    return userRepository.save(user);       
}
 

При попытке сохранить пользователя, используя приведенные ниже данные запроса, получаю неверный запрос, как я могу это решить

 {
    "name": "Pradeep",
   "day": {
        "key": 1,
        "value": "Monday"
    },
    "month": "JUNE"
}
 

Комментарии:

1. Привет, пожалуйста, опубликуйте код контроллера, в котором вы выполняете действие сохранения, и образец запроса (я думаю, отправьте запрос)

2. @pleft обновил сообщение с моим кодом контроллера

Ответ №1:

Если вы действительно хотите вернуть полный объект перечисления в своем REST API, то одним из решений может быть добавление к нему пользовательского десериализатора:

 @JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Days {
   MONDAY(1,"Monday"), TUESDAY(2,"Tuesday"),THURSDAY(4,"Thursday"), FRIDAY(5,"Friday"), SATURDAY(6,"Saturday"), 
   SUNDAY(7,"Sunday");
   
   private final Integer key;
   private final String value;

   Days(Integer key, String value) {
       this.key = key;
       this.value = value;
   }

   public Integer getKey() {
       return key;
   }

   public String getValue() {
       return value;
   }

   @JsonCreator
   public static Days fromObject(Map<String, Object> obj) {
      if (obj != null amp;amp; obj.containsKey("key") amp;amp; obj.containsKey("value")) {
          Integer key = obj.get("key");
          String value = obj.get("value");

          if (key != null) {
            for (Days day : Days.values()) {
                if (key.equals(e.getKey())) {
                  return day;
                } else {
                  return null;
                }
            }
          }
          return null;
      }
      return null;
   }
}
 

Кроме того, вы можете указать Hibernate, как хранить перечисление в базе данных. Вы можете использовать @Enumerated(EnumType.STRING) для этого следующее:

 public class User {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long userId;
   private String name;
   @Enumerated(EnumType.STRING)
   private Days day;
   private Month month;
}
 

Это сохранит его как String . Другой вариант-ПОРЯДКОВЫЙ, который сохранит перечисление как an Integer .

Комментарии:

1. Спасибо, все работает, как и ожидалось, не возражаю, я могу сделать апвот

2. Если это помогло вам, подумайте о том, чтобы принять его как правильный ответ, чтобы другие тоже могли извлечь из него пользу. Спасибо! 😉