【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);
}
- 複数の@Mappingアノテーションを指定する場合は@Mappingsを使用します。
- 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に設定するか、他のロジックを適用
}
}
}
}
是非フォローしてください
最新の情報をお伝えします