Лучший способ поддерживать пары сопоставления ключ-значение в Springboot Java

#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(...)