我正在实现一个API,该API使用update_mask类型的Field Mask来指定应在资源上更新的字段。
API类似于:
rpc UpdateBook(UpdateBookRequest) returns (Book)
message UpdateBookRequest {
Book book=1;
google.protobuf.FieldMask update_mask = 2;
}
当前代码类似于:
override suspend fun updateBook(request: UpdateBookRequest): Book {
if (!FieldMaskUtil.isValid(Book::class.java, request.updateMask)) {
throwStatusRuntimeException {
code = Code.INVALID_ARGUMENT_VALUE
message = "Invalid field mask"
}
}
request.book.let { book ->
request.updateMask.pathsList.let { updateMask ->
var displayName: BookDisplayNameValue? = null
var description: BookDescriptionValue? = null
if (updateMask.contains(BookFields.DISPLAY_NAME_FIELD)) {
displayName = BookDisplayNameValue(book.displayName)
}
if (updateMask.contains(BookFields.DESCRIPTION_FIELD)) {
description = BookDescriptionValue(book.description.ifBlank { null })
}
bookService.update(
bookId = BookIdValue(book.name),
displayName = displayName,
description = description,
)
}
}
//...
}
尽管可以使用,但随着添加更多字段,维护工作变得非常糟糕。
关于如何在服务器(Kotlin + Spring框架+ GRPC)上实现此行为,是否有任何最佳做法可以减少样板数量。