今天我开始使用MapStruct为我的项目创建我的Model to 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和他们各自的模型都是带有setter和getter的简单POJO所以我认为不需要发布代码(Notifica扩展Corrispondenza,如果你想知道的话)
这段代码进入了一个无限循环,没有什么比这更令人惊讶的了(虽然我希望它能处理这些情况).
虽然我认为我可以找到一种优雅的方式来手动处理它(我正在考虑使用带有@MappingTarget的方法来插入Referenced对象)我想知道是否有某种方法告诉MapStruct如何自动处理循环引用.
解决方法:
尚未对MapStruct中的此类案例进行检测或特殊处理,但有一个功能请求:#469.如果您有任何想法如何处理周期,请在该问题上发表评论.