Car*_*rán 5 java protocol-buffers mapstruct
鉴于这个原型
option java_outer_classname = "FooProto";
message Foo {
string bar = 1;
}
Run Code Online (Sandbox Code Playgroud)
这个java类:
public class MyFoo {
String bar;
}
Run Code Online (Sandbox Code Playgroud)
这个映射器(使用 Mapstruct):
@Mapper
public interface FooMapper() {
FooProto.Foo toProtoFoo(MyFoo myFoo);
}
Run Code Online (Sandbox Code Playgroud)
当我有一个带有空栏的 MyFoo 实例并尝试将其映射到原型时,我得到一个 NullPointerException。
这是因为映射器自动生成的代码调用原型的自动生成方法,如下所示:
public Builder setBar(java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
bar_ = value;
onChanged();
return this;
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以避免这个问题吗?(这不涉及在映射之前清理 MyFoo 实例,使其没有空值)
您需要使用不同的NullValueCheckStrategy.
例如
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface FooMapper() {
FooProto.Foo toProtoFoo(MyFoo myFoo);
}
Run Code Online (Sandbox Code Playgroud)
这将始终null在调用之前进行检查setBar
有关详细信息,请参阅控制bean 映射中属性的检查结果。null