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

MapStruct将Protobuf(proto3)映射到Java POJO

艾奕
2023-03-14

我正试着从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的答案。像这样的事情似乎不起作用。

共有1个答案

胡劲
2023-03-14

下面是一个示例的摘录,该示例介绍了如何使用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;如果需要,可以用字符串表示,我同意)”。在每次行使中,我有两个期权,一个“看跌”和一个“看涨”(这被称为期权的“右”)

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->