FieldMask更新方法的实现

时间:2019-09-12 21:13:38

标签: java kotlin protocol-buffers grpc

我正在实现一个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)上实现此行为,是否有任何最佳做法可以减少样板数量。

0 个答案:

没有答案