Скажем, у меня есть перечисление:
public enum ParameterList {
FREQUENCY_ID("500");
...
lot's of different constants here
...
private final String param;
ParameterList(String param) {
this.param = param;
}
@Override
public String toString() {
return param;
}
}
И скажем, у меня есть DTO с полем:
private String frequency;
Допустим, у меня есть JSON:
{"500" : "100Hz"}
Я хочу сопоставить этот json с моим dto, поэтому DTO.frequency будет иметь значение поля "500" json (которым будет "100Hz").
Я понимаю, что в качестве значений атрибутов следует использовать только константы, но есть ли какое-то обходное решение, чтобы сделать следующую работу?
@JsonProperty(ParameterList.FREQUENCY_ID)
private String frequency;
(@JsonProperty - это com.fasterxml.jackson.annotation.JsonProperty, версия 2.8.0)
Идея состоит в том, чтобы минимизировать редактирование кода, когда перечисление ParameterList.FREQUENCY_ID будет изменено с "500" на какое-то другое значение.
Я обновил свой вопрос. Я хочу сохранить значение поля «admin» из json, чтобы сделать DTO.something = "superuser".
Для меня это не имеет смысла ... Как это перечисление подходит в этом контексте?
Извини, что ввела тебя в заблуждение. Суть моего вопроса была немного другой. Я обновил вопрос, надеюсь, теперь он имеет больше смысла
@baao нет, не будет. The value must be constant.
Да, думал, что это тоже так
Возможный дубликат Как предоставить значение аннотации из константы java




JSON немного странный в том смысле, что {"admin": "superuser"} был бы более понятным, если бы он был похож на {"role": "superuser"} (или userType вместо роли). Однако, чтобы сопоставить значение с перечислением, все, что вам нужно сделать, это указать его в своем DTO. Для вашего json и перечисления, содержащего также superuser в качестве значения
public enum UserType {
ADMIN, SUPERUSER
....
}
все, что вам нужно сделать, это сделать так, чтобы ваш DTO имел перечисление как тип
private UserType admin; // <-- admin because that's your key's name (maybe change that)
Обратите внимание, что вы также можете использовать
@JsonProperty("admin") private UserType userType; // or whatever name you like
или что-то в этом роде, если вы не можете изменить json.
Извини, что ввела тебя в заблуждение. Суть моего вопроса была немного другой. Я обновил вопрос, надеюсь, теперь он имеет больше смысла
Вы можете попробовать следующее:
public enum ParameterList {
FREQUENCY_ID(Constants.FREQUENCY_ID_VALUE);
private final String value;
ParameterList(String value) {
this.value= value;
}
@Override
public String toString() {
return value;
}
public static class Constants {
public static final String FREQUENCY_ID_VALUE = "500";
}
}
Затем используйте:
@JsonProperty(ParameterList.Constants.FREQUENCY_ID_VALUE)
private String frequency;
Это работает, потому что JsonProperty требует строки времени компиляции. Java позволяет аннотации принимать перечисления во время компиляции, но только если они принимают необходимый тип. Хотя он не отвечает на вопрос OP напрямую, это может быть решением. Мне все еще интересно увидеть решение, которое, вероятно, потребовало бы специальной аннотации Джексона, которая принимает перечисление правильного типа.
@htshame, если вы используете константу, вам вообще нужно перечисление?
@RyanTheLeach Мне нужно перечисление, потому что я использую эту константу во многих местах, и есть много похожих констант. И главное, что эти константы будут время от времени изменяться в связи с новыми требованиями. Думаю, это решение идеально подходит для моих нужд.
Какую ценность вы хотите сохранить в
DTO.something?"admin"?