我正试着从Protobuf映射到POJO。以下是POJO:
public class CreateNodesAllDataDto {
private List<UpsertNodeDto> tables;
private List<UpsertColumnDto> columns;
}
其中upsertNodeDto
如下:
public class UpsertNodeDto {
@NotNull
private String workspaceId;
@NotNull
private String id;
@NotNull
private String name;
}
这是协议:
message UpsertNodeAllDataInput {
repeated UpsertTableInput tables = 1;
repeated UpsertColumnInput columns = 2;
}
message UpsertTableInput {
string workspace_id = 1;
string id = 2;
string name = 3;
}
你明白了。
现在的问题是MapStruct没有映射Protobuf中重复的字段,因为生成的Java文件中这些字段的getter是name xxx list。例如,从UpsertNodeAllDataInput获取表的方法是输入。getTablesList()而不是输入。getTables(),显然MapStruct无法识别这一点。
首先,肯定没有Protobuf生成问题,因为ModelMapper是一个类似的用途包,可以在转换过程中工作。这也不是MapStruct安装的问题,因为它对我来说适用于POJO到POJO的映射。这个问题只是上面描述的一个。
我四处寻找了一段时间,只找到了将POJO映射到Protobuf的答案。像这样的事情似乎不起作用。
下面是一个示例的摘录,该示例介绍了如何使用MapStruct将Protobuf中的重复字段映射到POJO(也可以使用Null检查):
import org.mapstruct.CollectionMappingStrategy;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.NullValueCheckStrategy;
import org.mapstruct.ValueMapping;
import org.mapstruct.factory.Mappers;
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
@Mapping(source = "permissions", target = "permissionsList")
@Mapping(source = "mainDepartments", target = "mainDepartmentsList")
@Mapping(source = "departments", target = "departmentsList")
UserDTO map(User user);
@Mapping(source = "permissionsList", target = "permissions")
@Mapping(source = "mainDepartmentsList", target = "mainDepartments")
@Mapping(source = "departmentsList", target = "departments")
User map(UserDTO userDTO);
@ValueMapping(source = "UNRECOGNIZED", target = MappingConstants.NULL)
Permission map(PermissionDTO permissionDTO);
PermissionDTO map(Permission perm);
Department map(DepartmentDTO departmentDTO);
DepartmentDTO map(Department department);
}
关于整个示例,请参阅:与问题相关的讨论,以及引用注释的源
例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?
下面是我的DTO。 源DTO 目标DTO
我需要将源类中的字段值映射到字段属性。我可以使用Mapstruct使用@mapper注释的'expression'参数来完成 有没有其他方法可以不使用“表达式”来进行映射?
...但我得到: 我不知道如何应用这些信息。首先,我认为我需要为列表声明一些额外的映射(在同一个映射器类中),所以MapStruct知道如何像这样映射列表类型的每个字段: ...但我收到错误消息
我用的是Protobuf 3。从文档来看,似乎无法定义嵌套贴图: 我正在尝试创建一种消息类型来表示期权链的定价信息(出价和要价)。对于那些不熟悉这些金融工具的人,基本上我有一套“到期日期(YYYYMMDD)”。在每个过期日期中,我都有一组“strikes(float number;如果需要,可以用字符串表示,我同意)”。在每次行使中,我有两个期权,一个“看跌”和一个“看涨”(这被称为期权的“右”)
错误: 我希望在列表中映射相同的字段名,而不需要另一个单独的方法,就像在另一个项目中使用旧的版本时一样。