マッピングメソッドに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;
}
}
_
現在、MapStructは、複数のソースプロパティを持つマッピングメソッドをサポートしていません。
ただし、あなたの場合は、1.2.0の_@Context
_を使用できます。私が理解していることから、projId
とcode
はマッピングのヘルパーとして存在し、ターゲットプロパティのマッピングには使用されません。
したがって、次のようなことができます(理論的には機能するはずです):
_@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));
バージョン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);