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

Orika可以映射嵌套集合吗?

赵俊远
2023-03-14

我想使用Orika library映射一个包含嵌套集合的字段。我在课堂上的领域定义如下:

private final List<List<Pojo>> list = new LinkedList<List<Pojo>>();

Pojo是一个简单的Pojo类。不幸的是,我有一个MappingException,它是由Orika内部逻辑中的NullPointerException引起的。

我做错事了吗?也许我需要使用自定义映射功能?

编辑:

下面是我的代码:

public class Pojo {
private int field;

public int getField() {
    return field;
}

public void setField(final int field) {
    this.field = field;
}

}

公共类源{private final List

public List<List<Pojo>> getList() {
    return list;
}

}

公共类目的地{private final List

public List<List<Pojo>> getListDest() {
    return listDest;
}

}

公共课主课{

public static void main(final String[] args) {

    final MapperFactory factory = new DefaultMapperFactory.Builder().build();

    factory.classMap(Source.class, Destination.class).field("list", "listDest").byDefault().register();

    final Source src = new Source();
    final LinkedList<Pojo> nestedList = new LinkedList<Pojo>();
    final Pojo pojo = new Pojo();
    pojo.setField(8978);

    nestedList.add(pojo);

    src.getList().add(nestedList);

    final MapperFacade facade = factory.getMapperFacade();
    final Destination dest = facade.map(src, Destination.class);

    System.out.println(dest.getListDest().get(0).get(0).getField());
}

}

执行上述代码会导致此异常:

Exception in thread "main" ma.glasnost.orika.MappingException: Error encountered while mapping for the following inputs: 
rawSource=com.bbh.nested.Source@39185ce6
sourceClass=class com.bbh.nested.Source
destinationClass=class com.bbh.nested.Destination

共有2个答案

史昀
2023-03-14

它可能需要通过customize定制映射,如果有很多这样的情况,您可以通过规范扩展Orika以支持此用例

帅煌
2023-03-14

你可以看到这个例子:

public class ShopEntity {
    private Long id;
    private String name;
    private String logo;
    private String url;
    private ProductCategory mainCategory;
    private Set<ShopRel> shopRels = new HashSet<>(0);
    private Account account;
    // Assume getter/setter
}

public class ProductCategory extends BaseEntity {
    private Long id;
    private String name;
    // Assume getter/setter
}

public class ShopRel {
    private Long id;
    private SaleChannel saleChannel;
    private Boolean enabled;
    // Assume getter/setter
}

public class SaleChannel {
    private Long id;
    private String name;
    private String image;
    private String description;
    private Boolean active;
    // Assume getter/setter
}


public class ShopDto {
    private Long id;
    private String name;
    private String logo;
    private String url;
    private Long mainCategory;
    private Set<ShopRelDto> shopRelDtos = new HashSet<ShopRelDto>();
    // Assume getter/setter
}

public class ShopRelDto {
    private Long channelId;
    private String name;
    private Boolean enabled;
    // Assume getter/setter
}

public class MapperUtils {
    private static final MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    private static final MapperFacade mapper = mapperFactory.getMapperFacade();
    static {
        mapperFactory.classMap(ShopEntity.class, ShopDto.class)
           .field("mainCategory.id", "mainCategory")
           .fieldMap("shopRels", "shopRelDtos").aElementType(ShopRel.class).bElementType(ShopRelDto.class).add()
           .register();
        mapperFactory.classMap(ShopRel.class, ShopRelDto.class)
           .field("saleChannel.id", "channelId")
           .field("saleChannel.name", "name")
           .field("enabled", "enabled")
           .register();
    }

    public static final void map(Object source, Object distance) {
        mapper.map(source, distance);
    }

    public static final <T> T map(Object source, Class<T> destinationClass){
        return mapper.map(source, destinationClass);
    }

    public static void main(String[] args) {
        ShopEntity shop = new ShopEntity();
        shop.setId(1L);
        shop.setName("ABC");
        ProductCategory productCategory =new ProductCategory();
        productCategory.setId(10L);
        shop.setMainCategory(productCategory);

        Set<ShopRel> shopRels = new HashSet<>(0);
        ShopSaleChannelRel channelRel = new ShopSaleChannelRel();
        channelRel.setId(1L);
        channelRel.setEnabled(true);
        SaleChannel saleChannel = new SaleChannel();
        saleChannel.setId(1L);
        saleChannel.setName("Channel1");
        channelRel.setSaleChannel(saleChannel);
        shopRels.add(channelRel);
        shop.setShopRels(shopRels);
        ShopDto shopDto = map(shop, ShopDto.class);
        System.out.println(shopDto);
    }
}
 类似资料:
  • 这些类映射不能用于双向映射。所以,我使用了两个不同的映射。但是使用两个不同的具有双向映射的类映射使上述方法都不起作用。我正在寻找一种方法来使用一个classmap只用于单向映射,这样我就可以使用上面的两个。 任何帮助都将不胜感激。谢了。

  • 我用的是Protobuf 3。从文档来看,似乎无法定义嵌套贴图: 我正在尝试创建一种消息类型来表示期权链的定价信息(出价和要价)。对于那些不熟悉这些金融工具的人,基本上我有一套“到期日期(YYYYMMDD)”。在每个过期日期中,我都有一组“strikes(float number;如果需要,可以用字符串表示,我同意)”。在每次行使中,我有两个期权,一个“看跌”和一个“看涨”(这被称为期权的“右”)

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

  • 我用下面的方法尝试了嵌套映射。 我在声明“root_cause”时出错:[{“type”:“mapper_parsing_exception”,“reason”:“root映射定义有不支持的参数:[type:nested]。” 感谢您的帮助。

  • 这很好,Orika自动确定bean上的属性名,并在expr中给我。但它没有告诉我类型。它也没有告诉我我试图映射到什么。在本例中,我只需假设目标是ResultSet。 如何知道要将数据放入的expr的类型?如果是,我将进行内联绑定调用,并告诉Orika使用。如果是时间戳,我将进行内联绑定调用并告诉Orika使用 我如何知道我试图从映射到,而不是从映射到?

  • 我已经定义了对象HomeContentDTO和SubscriberUpsertDTO的映射 下面是这两个对象的映射配置 HomeContentDTO中的所有映射值都没有复制到SubscriberUpsertDTO。有人知道原因吗?