web-dev-qa-db-ja.com

複数のパラメーターを持つMapStructQualifiedByName

マッピングメソッドに3つのパラメーターがあり、3つすべてがターゲットタイプのプロパティの1つを導出するために使用されている状況に遭遇しました。

プロパティを取得するためのロジックを保持するデフォルトのマッピングメソッドをインターフェイスに作成しました。このメソッドを呼び出すために、_@Mapping_アノテーションでexpression = "Java( /*method call here*/ )"を使用できます。

_@qualifiedByName_のようなmapstructアノテーションのいずれかでこれを行う方法はありますか?式プロパティを持つアノテーションにコメントを付けてqualifiedByNameを使用しようとしましたが、機能しません:

_@Mapper
public interface OneMapper {

    @Mapping(target="id", source="one.id")
    //@Mapping(target="qualified",expression = "Java( checkQualified (one, projId, code) )")
    @Mapping(target="qualified",qualifiedByName="checkQualifiedNamed")
    OneDto createOne (One one, Integer projId, Integer val, String code);

    @Named("checkQualifiedNamed")
    default Boolean checkQualified (One one, Integer projId, Integer val, String code) {
        if(one.getProjectId() == projId && one.getVal() == val && one.getCode().equalsIgnoreCase(code)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;                   
    }
}
_
3
Vivek Gupta

現在、MapStructは、複数のソースプロパティを持つマッピングメソッドをサポートしていません。

ただし、あなたの場合は、1.2.0の_@Context_を使用できます。私が理解していることから、projIdcodeはマッピングのヘルパーとして存在し、ターゲットプロパティのマッピングには使用されません。

したがって、次のようなことができます(理論的には機能するはずです):

_@Mapper
public interface OneMapper {

    @Mapping(target="id", source="one.id")
    @Mapping(target="qualified", qualifiedByName="checkQualifiedNamed")
    OneDto createOne (One one, @Context Integer projId, @Context String code);

    @Named("checkQualifiedNamed")
    default Boolean checkQualified (One one, @Context Integer projId, @Context String code) {
        if(one.getProjectId() == projId && one.getCode().equalsIgnoreCase(code)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;                   
    }
}
_

もう1つの方法は、これらすべてのプロパティを別のクラスに抽出して渡すことです(これにより、同じタイプの複数のパラメーターが可能になります)。

クラスは次のようになります。

_public class Filter {

    private final Integer projId;
    private final Integer val;
    private final String code;

    public Filter (Integer projId, Integer val, String code) {
        this.projId = projId;
        this.val = val;
        this.code = code;
    }

    //getters
}
_

マッパーは次のようになります。

_@Mapper
public interface OneMapper {

    @Mapping(target="id", source="one.id")
    @Mapping(target="qualified", qualifiedByName="checkQualifiedNamed")
    OneDto createOne (One one, @Context Filter filter);

    @Named("checkQualifiedNamed")
    default Boolean checkQualified (One one, @Context Filter filter) {
        if(one.getProjectId() == filter.getProjId() && one.getVal() == filter.getVal() && one.getCode().equalsIgnoreCase(filter.getCode())) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;                   
    }
}
_

次に、次のようにマッパーを呼び出すことができます:mapper.createOne(one, new Filter(projId, val, code));

4
Filip

バージョン1.2以降、サポートされています: http://mapstruct.org/documentation/stable/reference/html/#mappings-with-several-source-parameters

たとえば、次のようになります。

@Mappings({
  @Mapping(source = "person.description", target = "description"),
  @Mapping(source = "address.houseNo", target = "houseNumber")
})
DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);
1
Pim Hazebroek