【MapStruct】リスト型の特定のフィールドを無視したい!カスタムマッピング案も(Java)

リスト内の特定のフィールドを無視したい時がありますよね?

例を挙げてみます!

以下のオブジェクトを用意しました
Source ⇒ Targetにマッピングします!

Address.java

public class Address {
    private String street;
    private String city;
    private String zipcode;

    // getters and setters
}

■ Source.java

import java.util.List;

public class Source {
    private String name;
    private List<Address> addresses;

    // getters and setters
}

■ Target.java

import java.util.List;

public class Target {
    private String name;
    private List<Address> addresses;

    // getters and setters
}

1. @Mappingsを使用するマッピング

■ MyMapper.java

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

@Mapper
public interface MyMapper {
    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);

    @Mappings({
        @Mapping(target = "addresses[].zipcode", ignore = true) // リスト内のオブジェクトのフィールドを無視
    })
    Target sourceToTarget(Source source);
}
  1. 複数の@Mappingアノテーションを指定する場合は@Mappingsを使用します。
  2. target属性にリスト内のネストされたオブジェクトのフィールドを指定します。ここではaddresses[].zipcodeを無視するように設定しています。

2. カスタムマッピングを使用する方法

■ MyMapper.java

import org.mapstruct.AfterMapping;
import org.mapstruct.BeforeMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;

@Mapper
public interface MyMapper {
    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);

    @Mapping(target = "addresses[].zipcode", ignore = true)
    Target sourceToTarget(Source source);

    @AfterMapping
    default void afterMapping(@MappingTarget Target target, Source source) {
        if (target.getAddresses() != null) {
            for (Address address : target.getAddresses()) {
                address.setZipcode(null); // zipcodeをnullに設定するか、他のロジックを適用
            }
        }
    }
}

是非フォローしてください

最新の情報をお伝えします