今日、MapStruct を使用して、プロジェクトのモデルから DTO へのコンバーターを作成し始めました。循環参照が自動的に処理されるかどうか疑問に思っていましたが、そうではないことが判明しました。
これは、テスト用に作成したコンバーターです。
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に伝える方法があるかどうか疑問に思っていました.