FieldMask更新方法实现

Dus*_*tin 5 java protocol-buffers kotlin grpc

我正在实现一个 API,它使用Field Mask类型的update_mask来指定应在资源上更新的字段。

该 API 类似于:

rpc UpdateBook(UpdateBookRequest) returns (Book)
message UpdateBookRequest {
    Book book=1;
    google.protobuf.FieldMask update_mask = 2;
}
Run Code Online (Sandbox Code Playgroud)

目前代码看起来像这样:

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,
            )
        }
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

尽管它有效,但随着添加更多字段,维护工作非常糟糕。

是否有关于如何在服务器(Kotlin + Spring 框架 + GRPC)上实现此行为的最佳实践,可以减少样板文件的数量。