【问题标题】:Call a specific constructor to map @requestBody调用特定的构造函数来映射@requestBody
【发布时间】:2021-11-16 17:58:13
【问题描述】:

我有一个调用后方法,方法参数用 @ReuqestBody 注释,用于类 A。现在,在我的类 A 中,有一个 B 类型的变量,并且该类有几个子类。 在请求中,我传递了 B 子类型的枚举,并希望根据子类型初始化我的 requestBody。

class A {
    B b;
    ...

    A(Subtype S, B data) {
         // I need to initialize A based on subtype (my B's class would be dynamic here)
    }
}

class B {
    String s1;
}

class C extends B {
    int x;
}

class D extends B {
    double d;
    String s2;
}


class XYZController {

    public Resp doThis (@RequestBody A, @PathVariable SubType) {

    }
}

enum SubType {
    C ("C")
    D ("D")
}

所以整体结构是这样的。 现在,根据我作为子类型传递的内容,我想创建那种对象。 我对 Spring 在进行此类映射时如何调用构造函数感到有些困惑。任何线索都会有帮助。

非常感谢。

【问题讨论】:

  • 所以你说“我想创建那种对象”所以使用'?在请求体中并在服务层中使用简单的 if-else。
  • 是的,这是另一种解决方法。我不太确定在 requestbody 映射的情况下如何调用构造函数。因此,我试图检查是否可以在注入过程中执行此操作,而不是稍后在服务层中执行此操作。

标签: java spring constructor request-mapping dynamic-mapping


【解决方案1】:

为什么不公开所有可用的 API?拥有特定的 API 而不是通用的 API 是有意义的。

这是 KISS 模式:保持简单愚蠢。它可以让您增强 API 的可用性。

类似这样的:

@PostMapping(value="/mypath/v1/something-usefull-for-api-a")
public Resp doThis (@RequestBody A) {

}
@PostMapping(value="/mypath/v1/something-usefull-for-api-b")
public Resp doThisForB (@RequestBody B) {

}
@PostMapping(value="/mypath/v1/something-usefull-for-api-c")
public Resp doThisForC (@RequestBody C) {

}
...and so on...

【讨论】:

  • doThis() 函数是一个@postmapping。那么您是否建议为同一端点创建多个发布映射?如果参数类型从 A.B.C. 增加,这将无法很好地扩展。到 A.B.C.D....N
  • 我已编辑我的回复以尽可能清晰。从我的角度来看,您应该通过以下方式驱动您的 API 规范:一个定义/说明 -> 一个实现。如果您使用合同优先与代码优先,您的代码将更易于维护
  • 是的,这是在运行时 DI 不起作用的情况下的计划。但我的担忧还是一样,类型 A 有可能不止 2 或 3 个子类型,而且这种方式不那么可维护。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2011-12-29
  • 2019-04-02
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多