0

私はMapstructで新しくなっています。私はLocalDateTime型フィールドを含むモデルオブジェクトを持っています。 DTOにはInstantタイプフィールドが含まれます。 LocalDateTimeタイプフィールドをInstantタイプフィールドにマップしたいと思います。私はTimeZone着信要求のインスタンスを持っています。Mapstruct LocalDateTime to Instant

手動でフィールド設定を行う。

set(LocalDateTime.ofInstant(x.getStartDate(), timeZone.toZoneId())) 

Mapstructを使用してこれらのフィールドをマップするにはどうすればよいですか?

答えて

0

あなたが探しているものを達成するための2つの選択肢があります。

最初のオプション:

timeZoneプロパティに1.2.0.Finalから新しい@Contextアノテーションを使用してマッピングを実行することになり、独自のメソッドを定義します。ような何か:

public interface MyMapper { 

    @Mapping(target = "start", source = "startDate") 
    Target map(Source source, @Context TimeZone timeZone); 

    default LocalDateTime fromInstant(Instant instant, @Context TimeZone timeZone) { 
     return instant == null ? null : LocalDateTime.ofInstant(instant, timeZone.toZoneId()); 
    } 
} 

MapStructはその後InstantLocalDateTime間のマッピングを行うために提供される方法を使用します。

番目のオプション:

public interface MyMapper { 

    @Mapping(target = "start", expression = "java(LocalDateTime.ofInstant(source.getStartDate(), timezone.toZoneId()))") 
    Target map(Source source, TimeZone timeZone); 
} 

私の個人的なオプションは、最初の1

+0

を使用することですが、あなたにフィリップをありがとう、私は最初のオプションの方法(fromInstantとtoInstant)を備えたクラスを作成しました。このクラスをマッパー(@Mapper(uses = LocalTimeMapper.class))に参照しました。再度、感謝します。 – Batuhan

+0

使いやすさを考慮すると、それはさらに優れています。他の読者にとっては、すべてのデフォルトメソッドが別のクラスで実行され、 'Mapper#uses'を介して参照される可能性があります。 – Filip

+0

私は同意します。 MapstructマッパーをSpring Beanとして使用するかどうかという疑問があります。私はcomponentModel = 'spring'を使用すると、マッパーはシングルトンクラスになります(生成されたクラスは@Componentでアノテートされています)。 – Batuhan