问题描述
假设我在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
)