当前位置: 首页 > 知识库问答 >
问题:

Protobuf、MapStruct和null值

汪永春
2023-03-14
option java_outer_classname = "FooProto";
message Foo {
    string bar = 1;
}
public class MyFoo {
    String bar;
}

和此映射器(使用Mapstruct):

@Mapper
public interface FooMapper() {
    FooProto.Foo toProtoFoo(MyFoo myFoo);
}

当我有一个带有空条的MyFoo实例并尝试将其映射到proto时,我会得到一个NullPointerException。

这是因为映射器的自动生成代码为proto调用了一个自动生成的方法,该方法如下所示:

public Builder setBar(java.lang.String value) {
    if (value == null) {
        throw new NullPointerException();
    }

    bar_ = value;
    onChanged();
    return this;
}

共有1个答案

鲁旭
2023-03-14

您需要使用不同的NullValueCheckStrategy

例如。

@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface FooMapper() {
    FooProto.Foo toProtoFoo(MyFoo myFoo);
}

在调用setbar之前,这将始终执行检查

 类似资料:
  • 我正试着从Protobuf映射到POJO。以下是POJO: 其中如下: 这是协议: 你明白了。 现在的问题是MapStruct没有映射Protobuf中重复的字段,因为生成的Java文件中这些字段的getter是name xxx list。例如,从UpsertNodeAllDataInput获取表的方法是输入。getTablesList()而不是输入。getTables(),显然MapStruct

  • 我有一个用并尝试使用注释。该方法还用注释。将忽略注释。是否可以在Mapstruct方法上使用?

  • 我正在android实现中使用grpc和protobuf lite。但是protobuf lite没有谷歌时间戳,而我的protos有导入“google/protobuf/timestamp.proto”。所以我将实现'com.google.protobuf:protobuf-java:3.7.1'添加到包含google时间戳的gradle中。但在此之后,代码编译会出现错误。例如:在模块proto

  • 目前开源社区已经围绕Protobuf和gRPC开发出众多扩展,形成了庞大的生态。本节我们将简单介绍验证器和REST接口扩展。 4.6.1 验证器 到目前为止,我们接触的全部是第三版的Protobuf语法。第二版的Protobuf有个默认值特性,可以为字符串或数值类型的成员定义默认值。 我们采用第二版的Protobuf语法创建文件: syntax = "proto2"; package main;

  • 学习编程,重要的是什么?多练、多看、多实践!跨语言学习,掌握基础语法和语言的特性之后,实战,效率来的最快!——khlipeng RPC是远程过程调用的缩写(Remote Procedure Call),通俗地说就是调用远处的一个函数。远处到底有多远呢?可能是同一个文件内的不同函数,也可能是同一个机器的另一个进程的函数,还可能是远在火星好奇号上面的某个秘密方法。因为RPC涉及的函数可能非常之远,远到

  • 默认情况下,MapStruct将NullValueMappingStrategy作为RETURN_NULL。我的要求是,当source为null时,我需要抛出一个NPE,类似于lombok的@nonnull的工作方式。