(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)
}
假设我在 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)
}