自定义mapstruct以忽略protobuff字段



因为我注意到MapStruct已经更新为与Protobuff及其构建器交互,我考虑迁移我们的服务以充分使用MapStruct。

然而,我们仍然在编写手动转换到protobuff消息,因为编写完整的映射相当笨拙,考虑到我们有target_unmapped = Error策略:

compileJava {
options.compilerArgs += [
'-Amapstruct.unmappedTargetPolicy=ERROR'
]
}

这意味着即使是一个相当简单的映射,两个类具有相同的6个相同的字段名(a到f)看起来像这样:

@Mapper(componentModel = "spring", uses = {...})
public interface ProtoMapperExample {
@Mapping(target = "aBytes", ignore = true)
@Mapping(target = "bBytes", ignore = true)
@Mapping(target = "cBytes", ignore = true)
@Mapping(target = "dBytes", ignore = true)
@Mapping(target = "eBytes", ignore = true)
@Mapping(target = "fBytes", ignore = true)
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "clearField", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "allFields", ignore = true)
ProtoMessage toMessage(Source s);
}

这实在是不可接受的。但是关闭错误的选项同样是不可接受的。

我们的解决方案是不使用MapStruct进行这种转换,我完全同意。至少可以说它很麻烦。

然而,如果有一种方法可以配置我们的映射器来忽略至少后面的6个字段(mergeFrom, clearField, clearOneof, unknownFields, mergeUnknownFields, allFields),我们会假设并希望mapstruct默认这样做。即使那样也算是一种进步了。

但是我们还需要一种方法来忽略以"*Bytes"结尾的字段。

有什么办法吗?

MapStruct不支持这种忽略,但是您可以使用Mapping Composition来简化您的映射器。所有需要忽略的字段都可以聚集到一个或多个注释中。
为忽略字段创建复合注释

import org.mapstruct.Mapping;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.CLASS)
@Mapping(target = "aBytes", ignore = true)
@Mapping(target = "bBytes", ignore = true)
@Mapping(target = "cBytes", ignore = true)
@Mapping(target = "dBytes", ignore = true)
@Mapping(target = "eBytes", ignore = true)
@Mapping(target = "fBytes", ignore = true)
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "clearField", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "allFields", ignore = true)
public @interface IgnoreProtobuff {
}

@IgnoreProtobuff应用到映射器

@Mapper
public interface ProtoMapperExample {
@IgnoreProtobuff
ProtoMessage toMessage(Source s);
}

已经有一个支持Protobuf的MapStruct扩展,它为您提供了开箱即用的功能。社区正在积极维护这个仓库,所以我建议使用这个:https://github.com/entur/mapstruct-spi-protobuf

相关内容

  • 没有找到相关文章

最新更新