gpt4 book ai didi

java - 自定义 mapstruct 以忽略 protobuff 字段

转载 作者:行者123 更新时间:2023-12-05 04:28:18 31 4
gpt4 key购买 nike

自从我注意到 MapStruct 已更新以与 Protobuff 及其构建器交互,我考虑迁移我们的服务以完全使用 MapStruct。

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

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

这意味着即使是一个相当简单的映射,两个类具有相同的 6 个相同的字段名称(a throug 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);

}

老实说,这是 Not Acceptable 。但是关闭错误的选项同样是 Not Acceptable 。

我们的解决方案是简单地不使用 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);
}

关于java - 自定义 mapstruct 以忽略 protobuff 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72646659/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com