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

Java ModelMapper平面模型到层次模型

华永逸
2023-03-14

我正在使用www.modelmapper。org和我正致力于将相同的“平面”JavaDTO映射到几个“层次”DTO
平面DTO有许多基本属性
层次结构有许多复杂类型,其中包含许多基本类型。这些DTO非常相似,但并不相同

“扁平”DTO:

class TransactionRequest
{
    String cashierNumber;
    Long amount;
    Integer currency;

    public String getCashierNumber {..
    ...
}

“分层DTO:

class PurchaseRequest
{
    POSInfo posInfo;
    Amount amount;        
    ...    

    public PosInfo getPosInfo {..
    public Amount getAmount { ..
    ...
}

class CancelRequest
{
    POSInfo posInfo;
    Amount amount;        
    ...

    public PosInfo getPosInfo {..
    public Amount getAmount { ..
    ...
}

class Amount
{    
    BigDecimal value;
    Integer currency;

    public Integer getCurrency{..
    ...
}

class PosInfo
{    
    String cashierNumber;

    public String getCashierNumber {..
}

TransactionRequest应映射为1)PurchaseRequest和2)CancelRequest
问题之一是,金额必须从Long(小单位)转换为BigDecimal(大单位中有十进制数字)。我通过编写自己的长到大十进制转换器实现了这一点。现在,我遇到了以可重用方式定义所需映射的问题。我不想这样定义每个目标类型的映射:

class PurchaseMap extends PropertyMap<..
protected void configure()
{
using(new LongToBigDecimalConverter(...)).map().getAmount().setValue(source.getAmount());
...
}

class CancelMap extends PropertyMap<..
protected void configure()
{
using(new LongToBigDecimalConverter(...)).map().getAmount().setValue(source.getAmount());
...
}

我只想一次定义amountdto的映射(以及所有其他子类型映射,如PosInfo和更多),然后重新使用这些映射。我尝试了几个选项:

我尝试的第一件事是在ModelMapper中声明TransactionRequest到Amount DTO的映射。首先,我假设在将TransactionRequest映射到PurchaseRequest时,简单地声明此映射就足以使映射机制也被选中。但事实并非如此

我尝试的第二件事确实有效,但似乎过于复杂:

  1. 我创建了一个PropertyMap,用于将TransactionRequest映射到Amount
  2. 我创建了一个自定义转换器TransactionRequest来转换金额。此转换器的构造函数中需要ModelMapper。我传递给构造函数的ModelMapper是从1)创建PropertyMap的ModelMapper
  3. 我在PurchaseRequest和CancelRequest的属性映射中使用此转换器

下面是html" target="_blank">代码:

public class AmountMap extends PropertyMap<TransactionRequest , Amount>
{
    ....

    protected void configure()
    {
      using(new LongToBigDecimalConverter(...)).map().getAmount().setValue(source.getAmount());
        }
       ...
    }
}

public class TransactionRequestToAmountConverter extends AbstractConverter<TransactionRequest, Amount>
{
    private final ModelMapper mapper;

    public TransactionRequestToAmountConverter(ModelMapper mapper)
    {
        this.mapper = mapper;
    }

    public Amount convert(TransactionRequest transactionRequest)
    {
        return mapper.map(transactionRequest, Amount.class);
    }
}

public class PurchaseRequestMap extends PropertyMap<TransactionRequest, PurchaseRequest>
{
    private final ModelMapper   mapper;

    public PurchaseRequestMap(ModelMapper mapper)
    {
        this.mapper = mapper;
    }

    protected void configure()
    {           
        using(new TransactionRequestToAmountConverter(mapper)).map(source).setAmount(null);
        ...

    }
}

有人知道更简单的方法吗?

共有1个答案

柏明亮
2023-03-14

尝试将Long自身映射到Amount

modelMapper.createTypeMap(Long.class, Amount.class).setConverter(new Converter<Long, Amount>() {
  //... convert Long to Amount
});

然后,该映射将用于其他类型,并且应该消除对其他内容的需求(如果我正确阅读了您的类型)。

 类似资料:
  • Django 提供了一个抽象层(模型),对您的Web 应用中的数据进行构建及操作。通过以下内容来了解更多:

  • 这个问题似乎相当复杂,所以我在这里发布这个问题,寻找任何可能的解决方法。 我有地图清单。我想要一个地图列表,但要确保地图被转换成某种层次结构。 原始数据:(列表 此地图列表将转换为以下地图列表:(列表) 作为一个简单的解决方案,我试图手动处理它们(真的很无聊),所以我在寻找使用流或任何其他可能的方式来处理它们的任何高效、干净的方法。 更新朴素的解决方案如下

  • 问题内容: 我将Play Framework 1.2.4与和一起使用。我想拥有一个模型层次结构,并看到有一些替代方法。 我有一个基类(抽象的)和两个扩展该基类的具体类。我不想坚持这个基础课程,而我想拥有具体的课程。在基类中,我还有另一个Model类作为属性,换句话说,我在基类中有关系。 我的问题是实现此目标的最佳方法是什么?使用或与策略?我有点困惑,因为它们看起来 几乎 相等。 我还担心将来可能会

  •        在LSV中可以对模型进行平移操作,一般用于将目标模型进行位置调整,或者将其高程进行调整(有些模型加载出来可能贴于地标所以无法显示出来,可通过调整高程使其显示)。        先选择自己所要平移模型的图层之后点击选择模型所平移的参考点的起点与终点,并且可对效果进行预览:        之后同样的在选择所需要平移模型的图层后可对其高度进行调整,通过自己输入调整值可对其进行相对于原高度的

  • 模型平移        在LSV中可以对模型进行平移操作,一般用于将目标模型进行位置调整,或者将其高程进行调整(有些模型加载出来可能贴于地标所以无法显示出来,可通过调整高程使其显示)。        先选择自己所要平移模型的图层之后点击选择模型所平移的参考点的起点与终点,并且可对效果进行预览:        之后同样的在选择所需要平移模型的图层后可对其高度进行调整,通过自己输入调整值可对其进行相对

  • 本文向大家介绍分层数据模型,包括了分层数据模型的使用技巧和注意事项,需要的朋友参考一下 分层数据模型是最早的数据模型之一。该模型是基于文件的模型构建,就像树一样。在此树中,父节点可以与多个子节点关联,但是一个子节点只能有一个父节点。 对于目录和文件,可以说单个目录进一步包含多个文件或目录,然后这些目录包含更多文件,依此类推。 这可以表示为- 示例 使用关系数据库的层次模型的示例如下- <员工> E