Spring Boot我如何在Rest Controller中忽略请求正文中的某些字段

问题描述

假设我在rest控制器类中有signUp方法,如下所示。

f

因此它需要请求主体,即RegisterUserCommand。

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

我想忽略诸如userId和balance之类的字段,以便以后可以在控制器内部像这样生成

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

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

解决方法

@flaxel正确指出,您可以使用Kotlin的?,我相信也可以添加@JvmOverloads constructor

但是,我认为使用DTO是肯定可以解决此问题的最佳方法。 Controller的输入不应是Command,而应是包含您感兴趣的字段的DTO。使用增强的值构建命令的方式应不受此影响。 / p>

在这种情况下,您会遇到类似的情况(还添加了@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 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)
}
,

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

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