UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Java】MapStructのMappingアノテーション内で式を使いたい

2021/10/27 更新
この記事にあるようなことをしなくてもやりたいことが実現できたので、以下の記事も合わせて確認してください。

uga-box.hatenablog.com


以前の記事のPostGISを使った緯度経度検索で、取得結果を次のプロパティをもつDTOを用意した

   private BigDecimal lat;
   private BigDecimal lng;

uga-box.hatenablog.com

ドメインとして緯度経度は4 つのクラスで定義していたのでこれらにマッピングしたい

public class Latitude {
  @NonNull BigDecimal latitude;
}
public class Longitude {
  @NonNull BigDecimal longitude;
}
public class LatLng {
  @NonNull Latitude latitude;
  @NonNull Longitude longitude;
}
public class Coordinate {
  public LatLng latLng;
}

このプロジェクトではMapStructを利用しているので@Mappingを使いたい uga-box.hatenablog.com

インスタンス化をともなう式をどうやって記述するのか調べたら次のように書くことができることがわかった

https://mapstruct.org/documentation/dev/reference/html/#expressions

ドキュメント例

@Mapping(target = "timeAndFormat", expression = "java( new org.sample.TimeAndFormat( s.getTime(), s.getFormat() ) )")
Target sourceToTarget(Source s);

expressjava()で囲った中でインスタンス化をすることができる

このとき、そのファイルないでimportしていない限りは、パッケージ名を指定しなければならない

これによりやりたいことは次のようにして実現できた

@Mapping(expression = "java( new my.app.domain.LatLng(new my.app.domain.Latitude(result.getLat()), new my.app.domain.Longitude(result.getLng())))", target = "latLng")
Coordinate translate(ResultDto result);