【问题标题】:Java Class based on Enum fields基于枚举字段的 Java 类
【发布时间】:2020-03-15 00:48:34
【问题描述】:

我在这里处理 JWT 并设置自定义字段。 所有这些自定义字段都在枚举中描述:

public enum JwtFields {
    userId,
    manyOtherCustomFieldsBellow,
    blaBlaBla
}

因此,每当我创建令牌而不是为键传递字符串时,我都会使用枚举,因为它更快、更安全。

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

现在,一旦我检查收到的令牌是否有效并且所有必要的自定义字段都存在,我想将其反序列化为某个 TokenDecoded 类并将其附加到请求有效负载,所以每当我处理请求时,我将包含来自 JWT 令牌的所有值和字段。

但是,反序列化类几乎包含枚举中的所有字段,如果明天我将向枚举添加新字段,我还必须手动更新我的 TokenDecoded 类以包含该新自定义字段。

问题: 我怎样才能使这个TokenDecoded 类基于枚举字段,所以如果我向枚举添加一个新字段,它将自动出现在TokenDecoded 中?是否涉及反射?还是可以更简单的实现?

【问题讨论】:

  • @Jan Rieke 感谢您编辑我可怕的错别字,我现在很尴尬:D

标签: java reflection enums jwt


【解决方案1】:

Lombok 提供了一个相反的功能:如果你在一个类中定义你的字段,你可以用@FieldNameConstants(asEnum = true) 注释它以根据字段名称生成一个枚举。或者,如果没有 asEnum 参数,如果您只需要字符串形式的字段,您将获得 public static final Strings。

【讨论】:

  • 谢谢!其他方面也完全符合我的需要!已经更新了我的代码!
【解决方案2】:

您有多种选择:

  • 使用地图而不是类。最简单的解决方案,但不强制输入或字段。
  • 代码生成:可以在编译时生成类(例如JavaPoet)。
  • 字节码生成:您可以在运行时为类生成字节码(例如Javassist)。
  • 使用 Groovy metaprogramming 功能(或任何其他支持运行时数据结构定义的基于 JVM 的语言)。

我认为在编译时生成代码最适合您的场景。

请注意,如果您使用的是 JWT,您可能需要查看 a JWT library 而不是重新发明轮子。

【讨论】:

  • 感谢您的提示!我一定会调查每个选项。可悲的是,每个选项都在编译时解决。什么意思我不能将 Lombok 附加到 TokenDecoded 并使用 tokenDecodedInstance.getSomeFieldGeneratedFromEnum() 关于 JWT,我实际上使用的是 io.jsonwebtoken,而不是 com.auth.java-jwt,不确定哪个更好,但我会调查两者。但乍一看,并没有提到任何关于反序列化的内容
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2011-08-01
  • 2022-12-25
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多