#java #spring #spring-boot #api
#java #spring #spring-boot #API
Вопрос:
Я хочу знать, как лучше всего обрабатывать сопоставление ключ-значение в API Springboot.
Запрос API выглядит следующим образом:
{
"a": "1",
"b": "b"
}
Затем этот API вызывает нижестоящий API. Но прежде чем это произойдет, мне нужно преобразовать значения полей a и b. Преобразование будет соответствовать:
For field a:
1 -> One,
2 -> Two,
3 -> TATA
for fields b:
b -> beta,
a -> alpha,
c -> c
Оба вышеуказанных сопоставления являются постоянными (не будут меняться повсюду) и, следовательно, должны быть инициализированы и поддерживаться в нашем API. Теперь, когда сопоставление выполняется, запрос к нижестоящему API будет выглядеть следующим образом.
{
"a" : "One",
"b" : "beta"
}
т.е. 1 сопоставляется с единицей для поля a, а b сопоставляется с beta для поля b; на основе сопоставления значений ключа, упомянутого выше.
Для достижения этой цели необходимо знать лучшие практики в Java и Spring boot. Как мне поддерживать таблицу сопоставления, инициализировать ее только один раз и преобразовывать входящие запросы API в соответствующие значения во время выполнения.
Невозможно использовать enum, потому что некоторые ключи являются числовыми. Если хэш-карта и таблица Hast — мои лучшие ставки, то как мне их инициализировать и поддерживать их повсюду, поскольку сопоставление является постоянным, не хочу создавать их снова и снова для каждого вызова API? Откуда я могу прочитать пары ключ-значение для инициализации хэш-карты / таблицы?
Ответ №1:
Вы можете сохранить свои переводы в коде в частном статическом конечном поле и инициализировать его в статическом блоке инициализации:
private static final Map<String, Map<String, String>> TRANSLATIONS_PER_KEY = new HashMap<>();
static {
Map<String, String> translateForA = new HashMap<>();
translateForA.put("1", "One");
...
TRANSLATIONS_PER_KEY.put("a", translateForA);
...
}
Затем вы могли бы выполнить перевод, используя Guava Maps.transformEntries():
Map<String, String> translated =
Maps.transformEntries(input, (key, value) ->
TRANSLATIONS_PER_KEY.get(key)
.getOrDefault(value));
Если вы хотите избежать указателей NULL и возвращать исходное значение, если нет перевода, вы можете сделать это следующим образом:
Map<String, String> translated =
Maps.transformEntries(input, (key, value) ->
TRANSLATIONS_PER_KEY.getOrDefault(key, emptyMap())
.getOrDefault(value, value));
Ответ №2:
Вы можете создать enum для всех сопоставлений с помощью pares
@AllArgsConstructor
@Getter
public enum AType {
ONE("One", "1"),
TWO("Two", "2"),
TATA("TATA", "3");
private String translation;
private String mapping;
public String of(String v) {
for (AType aType : values()) {
if (aType.getMapping().equals(v)) {
return translation;
}
}
throw new IllegalArgumentException("try again");
}
}
и новое перечисление для b
Комментарии:
1. Как мне напрямую использовать метод of()? Нужно ли мне создавать новый объект перечисления AType? Нужно ли мне делать это каждый раз?
2. @UmairKhan Нет, каждое значение перечисления является константой. Вы бы сделали
AType.ONE.of(...)