Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字段掩码更新方法的实现_Java_Kotlin_Protocol Buffers_Grpc - Fatal编程技术网

Java 字段掩码更新方法的实现

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.

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

API类似于:

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。提交事务