2021/10/27 更新
この記事にあるようなことをしなくてもやりたいことが実現できたので、以下の記事も合わせて確認してください。
以前の記事のPostGISを使った緯度経度検索で、取得結果を次のプロパティをもつDTOを用意した
private BigDecimal lat; private BigDecimal lng;
ドメインとして緯度経度は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);
express
でjava()
で囲った中でインスタンス化をすることができる
このとき、そのファイルないで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);