(Spring boot) 如何忽略 rest 控制器中请求体中的某些字段

(Spring boot) How can I ignore some field from request body inside rest controller

假设我在 rest 控制器中有 signUp 方法 class 看起来像这样。

  @PostMapping("/signup")
  fun authenticateSignUp(@RequestBody command: RegisterUserCommand): CompletableFuture<String> {
    return commandGateway.send<String>(command)
  }

所以需要请求体RegisterUserCommand

data class RegisterUserCommand(
  val userId: String,
  val balance: BigDecimal,
  val username: String,
  private val email: String,
  private val password: String
)

我想忽略一些字段,例如 userId、balance,这样我可以稍后在控制器中生成它,就像这样

@PostMapping("/signup")
fun authenticateSignUp(@RequestBody request: RegisterUserCommand): CompletableFuture<String> {
  val command = request.copy(userId = ObjectId.get().toHexString(), balance = BigDecimal.ZERO)
  return commandGateway.send<String>(command)
}

是否有任何注释可以忽略此字段,因此它不会return错误的请求,即使我没有在请求正文中放入 userId、balance

我想您可以使用 ? 运算符将变量标记为可为空。但我建议使用 DTOs.

data class RegisterUserDto(
  val username: String,
  private val email: String,
  private val password: String
)

正如@flaxel 正确指出的那样,您可以使用 Kotlin 中的 ?,我相信也可以向其中添加 @JvmOverloads constructor

但是,在我看来,使用 DTO 无疑是处理该问题的最佳方式。 你的 Controller 的输入不应该是 Command 而只是一个 DTO 和你感兴趣的字段。你如何使用增强值构建你的命令不应该受到它的影响。

在这种情况下,你会得到这样的东西(还添加了 @TargetAggregateIdentifier 因为你可能错过了它):

data class RegisterUserCommand(
  @TargetAggregateIdentifier
  val userId: String,
  val balance: BigDecimal,
  val username: String,
  private val email: String,
  private val password: String
)

...

data class RegisterUserDto(
  val username: String,
  private val email: String,
  private val password: String
)

...

@PostMapping("/signup")
fun authenticateSignUp(@RequestBody request: RegisterUserDto): CompletableFuture<String> {
  val command = new RegisterUserCommand // build the command the way you want it
  return commandGateway.send<String>(command)
}