2017-04-13 8 views
0

@Mapping/sourceで参照されるすべてのプロパティがnullの場合、生成されたmapstructマッピングメソッドでnullを返すようにします。 exempleために、私は、次のマッピングを有する:Mapstruct Mapping:すべてのソースパラメータのプロパティがnullの場合、ヌルオブジェクトを返します。

@Mappings({ 
     @Mapping(target = "id", source = "tagRecord.tagId"), 
     @Mapping(target = "label", source = "tagRecord.tagLabel") 
}) 
Tag mapToBean(TagRecord tagRecord); 

を生成する方法は、次にある:

public Tag mapToBean(TagRecord tagRecord) { 
    if (tagRecord == null) { 
     return null; 
    } 

    Tag tag_ = new Tag(); 

    if (tagRecord.getTagId() != null) { 
     tag_.setId(tagRecord.getTagId()); 
    } 
    if (tagRecord.getTagLabel() != null) { 
     tag_.setLabel(tagRecord.getTagLabel()); 
    } 

    return tag_; 
} 

テストケース:TagRecordオブジェクトがヌルではなく== NULLとtagLibelle == NULL TAGIDました。

現在の行動:返されたタグオブジェクトがnullではありませんが、私は実際に行うには、生成されたメソッドが(tagRecord.getTagId場合はnullタグオブジェクトを返すで欲しい== == nullのとtagLibelleヌル

をTAGIDました()== null & & tagRecord.getTagLabel()== null)。 これは可能ですか?これをどのように達成できますか?

答えて

1

これは現在、MapStructでは直接サポートされていません。しかし、Decoratorsの助けを必要とするものを達成することができ、すべてのフィールドが空であるかどうか手動でチェックして、オブジェクトの代わりにnullを返す必要があります。

@Mapper 
@DecoratedWith(TagMapperDecorator.class) 
public interface TagMapper { 
    @Mappings({ 
     @Mapping(target = "id", source = "tagId"), 
     @Mapping(target = "label", source = "tagLabel") 
    }) 
    Tag mapToBean(TagRecord tagRecord); 
} 


public abstract class TagMapperDecorator implements TagMapper { 

    private final TagMapper delegate; 

    public TagMapperDecorator(TagMapper delegate) { 
     this.delegate = delegate; 
    } 

    @Override 
    public Tag mapToBean(TagRecord tagRecord) { 
     Tag tag = delegate.mapToBean(tagRecord); 

     if (tag != null && tag.getId() == null && tag.getLabel() == null) { 
      return null; 
     } else { 
      return tag; 
     } 
    } 
} 

私が書かれている例(コンストラクタ)はdefaultコンポーネントモデルであるマッパのためのものです。

  • Decorators with Spring
  • Decorators with JSR 330
  • あなたがCDIを使用する場合は、あなたが@DecoratedWithを使うべきではありませんが、あなたは代わりにCDI Decorators
  • を使用する必要があります:あなたは春または別のDIフレームワークを使用する必要がある場合を見てみましょう
関連する問題