Java 字段掩码更新方法的实现
我正在实现一个API,它使用of类型来指定应该在资源上更新的字段 API类似于:Java 字段掩码更新方法的实现,java,kotlin,protocol-buffers,grpc,Java,Kotlin,Protocol Buffers,Grpc,我正在实现一个API,它使用of类型来指定应该在资源上更新的字段 API类似于: rpc UpdateBook(UpdateBook请求)返回(Book) 消息UpdateBookRequest{ 书本=1; google.protobuf.FieldMask update_mask=2; } 当前代码看起来像: override suspend fun updateBook(request: UpdateBookRequest): Book { if (!FieldMaskUtil.
rpc UpdateBook(UpdateBook请求)返回(Book)
消息UpdateBookRequest{
书本=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 framework+GRPC),是否有任何最佳实践可以减少样板文件的数量。是的,字段掩码非常可怕。。。查看一下
FieldMaskUtil
,但这是最好的FieldMaskUtil
在客户端似乎很方便。我还没有看到它在服务器端有什么帮助。我正在考虑merge()
方法。使用默认值构造一个proto,并合并到传入的proto中。对于更新,您可以选择1,而不是传入空值。启动事务,2。从存储器中读取proto,3。在请求协议中合并并记住字段掩码,4。写下来,5。提交事务