今日私は自分のプロジェクト用のModel to DTOコンバータを作成するためにMapStructを使い始めましたが、循環参照を自動的に処理するかどうかは不思議でした。MapStructで変換するときに巡回参照を防止する
これは私がそれをテストするために作られたコンバータです。
package it.cdc.snp.services.rest.giudizio;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import org.springframework.stereotype.Component;
import it.cdc.snp.dto.entita.Avvisinotifica;
import it.cdc.snp.dto.entita.Corrispondenza;
import it.cdc.snp.model.notifica.AvvisoDiNotificaModel;
import it.cdc.snp.model.notifica.NotificaModel;
import it.cdc.snp.model.procedimento.ProcedimentoModel;
@Component
@Mapper(componentModel="spring")
public interface NotificaMapper {
NotificaMapper INSTANCE = Mappers.getMapper(NotificaMapper.class);
@Mappings({
@Mapping(source = "avvisinotificas", target = "avvisinotificas"),
})
NotificaModel<ProcedimentoModel> corrispondenzaToNotificaModel(Corrispondenza notifica);
@Mappings({
@Mapping(source = "corrispondenza", target = "notifica"),
})
AvvisoDiNotificaModel avvisinotificaToAvvisoDiNotificaModel(Avvisinotifica avvisinotifica);
}
これはテストです:
Notifica sourceObject1 = new Notifica();
sourceObject1.setId(new Long(1));
Avvisinotifica sourceObject2 = new Avvisinotifica();
sourceObject2.setId(new Long(11));
List<Avvisinotifica> tests= new ArrayList<>();
tests.add(sourceObject2);
sourceObject1.setAvvisinotificas(tests);
sourceObject2.setCorrispondenza(sourceObject1);
NotificaModel destObject1 = new NotificaModel<>();
Avvisinotifica destObject2 = new Avvisinotifica();
NotificaModel converted = mapper.corrispondenzaToNotificaModel(sourceObject1);
Notifica、Avvisinotificaとそれぞれのモデルはドン私そうセッターとゲッターを持つ単純なPOJOをしていますコードを投稿する必要があると思います(あなたが不思議であれば、NotificaはCorrispondenzaを拡張します)
このコードは無限のサイクルになります。 (私はこれらの状況を処理することを望んだが)。 そして私は手動でそれを扱うエレガントな方法を見つけることができると思うが(私は@MappingTarget
とメソッドを使用して参照オブジェクトを挿入することを考えていた)私は循環参照を自動的に処理する方法をMapStructに伝えるいくつかの方法があるかどうか不思議だった。
は、私は私がやりましたなあ! 1つは、ラッパークラスを使用し、getterが呼び出されたときにその場所で変換することができます。または、問題の作成者が述べたように、既に変換されたアイテムを保持するマップを使用し、変換プロセス中にすでに変換済みのオブジェクトが見つかった場合は、新しいオブジェクトを変換するのではなく、セッターでそのオブジェクトを使用します。しかし、私は実際にそのような提案を容易にするのに十分な専門家ではない – valepu