5

依存性注入を使用する Spring アプリで、MapStruct を使用して JPA エンティティから POJO DTO にマップしています。

ドキュメントで指定されているように、デコレータのメソッドに DTO の追加処理を追加しました。

単一のエンティティのマッピングには問題なく機能します。しかし、これらのエンティティのコレクション (セット) のマッピングもあり、これらのエンティティのコレクションがリレーションシップで見つかると、メソッドが自動的に呼び出されます。

ただし、生成されたコレクション マッピング メソッドは、装飾されたメソッドを使用して各エンティティをマップするのではなく、デリゲートで「バニラ」生成メソッドを使用するだけです。生成されたメソッドのコードは次のとおりです。

@Override
public Set<DimensionItemTreeDTO> missionSetToTreeDtoSet(Set<Mission> set)  {
    return delegate.missionSetToTreeDtoSet( set );
}

デリゲート メソッド自体はデコレータを認識せず、個別のアイテム マッピング メソッドを呼び出します。

@Override
public Set<DimensionItemTreeDTO> missionSetToTreeDtoSet(Set<Mission> set) {
    if ( set == null ) {
        return null;
    }

    Set<DimensionItemTreeDTO> set__ = new HashSet<DimensionItemTreeDTO>();
    for ( Mission mission : set ) {
        set__.add( missionToTreeDto( mission ) ); //here the decorator is not called !
    }

    return set__;
}

...そして、コレクション内のアイテムに対して装飾されたメソッドが呼び出されることはありません。

Mapstruct にコレクション マッピングでデコレータ メソッドを使用させる方法はありますか? デコレータでコレクション メソッドを手動で記述する以外に方法はありますか?この種のコードを書く)?

4

1 に答える 1

9

私は自分の問題の解決策を見つけました: 実際、私のユースケースは MapStruct @AfterMapping メソッドにより適していました。

@Mapper
public abstract class ConstraintsPostProcessor {

    @Inject
    private UserService userService; // can use normal Spring DI here

    @AfterMapping
    public void setConstraintsOnMissionTreeDTO(Mission mission, @MappingTarget MissionDTO dto){ // do not forget the @MappingTarget annotation or it will not work
        dto.setUser(userService.getCurrentUser()); // can do any additional logic here, using services etc.
    }
}

そしてメインマッパーで:

@Mapper(uses = {ConstraintsPostProcessor.class}) // just add the previous class here in the uses attribute
public interface DimensionMapper {
    ...
}
于 2016-05-16T15:23:57.807 に答える