Java Класс на основе полей Enum - PullRequest
0 голосов
/ 15 марта 2020

Я имею дело с JWT и настройкой пользовательских полей. Все эти настраиваемые поля описаны в Enum:

public enum JwtFields {
    userId,
    manyOtherCustomFieldsBellow,
    blaBlaBla
}

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

Claims claims = Jwts.claims().setSubject(userId);
claims.put(JwtFields.someCustomFieldFromEnum.name(), "someValue")

Теперь, когда я проверяю, что полученный токен действителен и все необходимые настраиваемые поля присутствуют, я хочу десериализовать его в некоторый класс TokenDecoded и присоединить его к полезной нагрузке запроса, поэтому всякий раз, когда я обрабатываю запрос У меня будут все значения и поля из токена JWT.

Однако этот класс десериализации в значительной степени содержит все поля из перечисления, и если завтра я добавлю новые поля в перечисление, мне придется также вручную обновите мой класс TokenDecoded, включив в него и это новое настраиваемое поле.

Вопрос: Как я могу сделать этот класс TokenDecoded основанным на полях перечисления, так что если я добавить новое поле в перечисление, оно будет автоматически присутствовать в TokenDecoded? Есть ли отражение? Или это может быть достигнуто проще?

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Lombok предоставляет функцию, которая работает наоборот: если вы определяете свои поля в классе, вы можете пометить его с помощью @FieldNameConstants(asEnum = true), чтобы сгенерировать перечисление на основе имен полей. Или без параметра asEnum вы получите public static final String s для своих полей, если он вам нужен только в виде строк.

0 голосов
/ 15 марта 2020

У вас есть несколько вариантов:

  • Использовать карту вместо класса. Самое простое решение, но не требует ввода или полей.
  • Генерация кода: вы можете генерировать класс во время компиляции (например, JavaPoet ).
  • Генерация байтового кода: вы может генерировать байт-код для класса во время выполнения (например, Javassist ).
  • Использование Groovy метапрограммирования функций (или любого другого языка на основе JVM, который поддерживает данные времени выполнения определение структуры).

На мой взгляд, генерация кода во время компиляции лучше всего подходит для вашего сценария.

Обратите внимание, что если вы используете JWT, возможно, вы захотите взглянуть на библиотека JWT вместо изобретения колеса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...