【问题标题】:How do I check for the subclass type at runtime in the Spring Controller如何在 Spring Controller 中在运行时检查子类类型
【发布时间】:2021-07-03 17:04:49
【问题描述】:

我有一个将基类作为 RequestBody 的 API。我说 3 个实体(扩展我的 BaseClass 的 A、B 和 C)和 3 个相应的 JPA 存储库。在@controller 或@service 类中,我如何知道RequestBody 指的是哪个子类?我已经使用@JsonTypeInfo 和@JsonSubTypes 注释来序列化和反序列化,所以这不是问题。

  1. 我想弄清楚 @RequestBody 对象的类型,例如 @requestBody 对象是 instanceof A 还是 B 还是 C?
  2. 在这种情况下使用 instanceof 好不好?
  3. 如果我使用 instanceof 并且以后想再添加 50 个实体并说再增加 10 个 JPA 存储库,那么我不可能继续为这些 instanceof 条件添加 if/else。在这种情况下,最好的方法是什么?

【问题讨论】:

    标签: spring hibernate rest jpa server


    【解决方案1】:

    首先,是的,您可以在这种情况下使用实例。但是,如果您再增加 10 个类,您将不乐意再添加 10 个 if/then/else 块。在这种情况下,我想到了两种方法:

    1. 访问者模式:当你有这种链式的 ifs 实例时,这正是你想要的模式(例如 https://refactoring.guru/design-patterns/visitor/java/example)。
    2. 如果这是您拥有此链接的唯一地方,那么访问者可能会矫枉过正。您可以创建一个映射类 -> Lambda 函数。在您的构造函数中对其进行初始化,然后为每个类查找所需的行为。
    3. 您创建了一个地图 VO -> 实体。然后,您可以查询实体的存储库的应用程序上下文。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2020-06-20
      • 1970-01-01
      • 2016-09-09
      • 2014-06-02
      • 2013-11-02
      • 1970-01-01
      • 2012-01-27
      • 2014-09-13
      相关资源
      最近更新 更多