2016-05-16 21 views
1

私は、JPAエンティティからPOJO DTOへのマッピングにMapStructを使用しています。これは、依存性注入を伴うSpringアプリケーションです。Mapstructコレクションマッパーでデコレーションされたメソッドを使用する方法?

デコレータのメソッドas specified in the docにDTOの処理を追加しました。

1つのエンティティをマッピングするには問題ありません。しかし、私はまた、これらのエンティティのコレクション(セット)のマッピングを持っており、そのエンティティのコレクションが関係で見つかると自動的にこのメソッドが呼び出されます。

しかし、生成されたコレクションマッピングメソッドはデコレートされたメソッドを使用して各エンティティをマッピングせず、単にデリゲートで "vanilla"生成メソッドを使用します。ここで生成されたメソッドのコードされています

@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にコレクションマッピングのデコレータメソッドを使用させる方法はありますか?デコレータにコレクションメソッドを手動で書き込むのは手間がかかります(動作しますが、冗長でMapStructの最初の場所にある目的を奪います。この種のコードを書く必要はありません)?

答えて

4

私は私の問題への解決策を見つけた:実際に私のユースケースは、MapStruct @AfterMapping methodsに適した、私はそれを使用し、それが今、すべてのケースのために正常に動作している:

@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 { 
    ... 
} 
関連する問題