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

使用自定义方法将字段映射到嵌套对象

权胜泫
2023-03-14

假设我有包含以下字段的传入对象:

class IncomingRequest {
    // ... some fields ommited
    String amount;   // e.g. "1000.00"
    String currency; // e.g. "840"
}

还有更多的字段可以转换为我的DTO:

class MyDto {
    // ... some fields which converts great ommited
    Amount amount;
}

class Amount {
    Long value;
    Integer exponent;
    Integer currency;
}

,但我想以自定义的方式映射这两个:

@Mapper
public interface DtoMapper {

    @Mappings({ ... some mappings that works great ommited })
    MyDto convert(IncomingRequest request);

    @Mapping( /* what should I use here ? */ )
    default Amount createAmount(IncomingRequest request) {
        long value = ....
        int exponent = ....
        int currency = ....
        return new Amount(value, exponent, currency);
}

这意味着我只需要编写一个方法来将incomingrequest的几个字段转换为嵌套的DTO对象。我该怎么做呢?

Upd:我不介意只将转换后的参数传递给方法:

default Amount createAmount(String amount, String currency) {
    ...
}

那就更好了。

共有1个答案

萧奇
2023-03-14

好吧,有一个构造映射方法参数如下所示:

@Mapper
public interface DtoMapper {

    @Mapping( target = "amount", source = "request" /* the param name */ )
    MyDto convert(IncomingRequest request);

    // @Mapping( /* what should I use here ? Answer: nothing its an implemented method.. @Mapping does not make sense */ )
    default Amount createAmount(IncomingRequest request) {
        long value = ....
        int exponent = ....
        int currency = ....
        return new Amount(value, exponent, currency);
}

或者,您可以进行后映射。

@Mapper
public interface DtoMapper {

    @Mapping( target = amount, ignore = true /* leave it to after mapping */ )
    MyDto convert(IncomingRequest request);

    @AfterMapping(  )
    default void createAmount(IncomingRequest request, @MappingTarget MyDto dto) {
        // which completes the stuff you cannot do
        dto.setAmount( new Amount(value, exponent, currency) );
}

注意:您可以省略java8中的@mappings

 类似资料:
  • 这是我的DTO: 这是我的实体: 我想配置我的ModelMapper将Tag#id映射到TagVolumeDTO#idTag。这可能吗?

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应 但是在中,我只需要值。因此,我决定创建Kotlin数据类,并尝试使用注释的选项 下面的代码正在工作 我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为节点创建嵌套类更好的方法吗?

  • 假设我有这些实体: null

  • 我有一个带有对象的RealmObject类,它实际上是PrimaryKey作为这个对象中的字符串。但不允许将对象作为主键。 因为目前不可能更改服务器的响应结构,所以我尝试了不同的方法来解决这个问题。但到目前为止,没有一个奏效。我在Android Studio中使用“io.realm:realm-gradle-plugin:0.87.2”作为和“realm-android”插件。 谢谢beeende

  • 我有两个对象,除了date成员外,其他成员都相同。在obj1中,date是java.sql.date,obj2.date是long(纪元)。 我需要编写一个映射器来将obj1映射到obj2。这就是我试图做的: 但是mapperImpl只有自己的日期转换实现: 我得到了: 这种转换的正确方式是什么?