#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. Если это помогло вам, подумайте о том, чтобы принять его как правильный ответ, чтобы другие тоже могли извлечь из него пользу. Спасибо! 😉