Spring 启动 Mapstruct StackOverFlow 错误

Spring boot Mapstruct StackOverFlow Error

我正在使用 mapstruct 来映射我的实体和 dto classes...我的映射器上的循环有问题 class...

我不知道该怎么做...这是我的映射器 classes

    @Mapper(componentModel = "spring", uses = {BrandMapper.class})
public interface VehicleTypeMapper {

    VehicleTypeDTO vehicleTypetoVehicleTypeDTO(VehicleType vehicleType);

    Iterable<VehicleTypeDTO> vehicleTypetoVehicleTypeDTO(Iterable<VehicleType> vehicleTypes);

    VehicleType vehicleTypeDTOtoVehicleType(VehicleTypeDTO vehicleTypeDTO);
}

    @Mapper(componentModel = "spring", uses = { VehicleTypeMapper.class, ModelMapper.class })
public interface BrandMapper {

    BrandDTO brandtoBrandDTO(Brand brand);

    Iterable<BrandDTO> brandtoBrandDTO(Iterable<Brand> brands);

    Brand brandDTOtoBrand(BrandDTO brandDTO);
}

我的实体 classes... DTO 与我的实体 classes...

具有相同的属性
@Entity
@Table(name = "tb_brand")
public class Brand implements Serializable {

    private static final long serialVersionUID = 1506494747401320985L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "vehicle_type_id", foreignKey = @ForeignKey(name = "fk_vehicle_type"))
    private VehicleType vehicleType;

    @JsonIgnore
    @OneToMany(mappedBy = "brand", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Model> models;

    @Column(name = "description", nullable = false)
    private String description;

//GETS AND SETS
}

@Entity
@Table(name = "tb_vehicle_type")
public class VehicleType {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @JsonIgnore
    @OneToMany(mappedBy = "vehicleType", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Brand> brands;

    @Column(name = "description", nullable = false)
    private String description;

//GETS AND SETS
}

堆栈跟踪

at br.com.meuveiculocerto.business.mapper.VehicleTypeMapperImpl.brandListToBrandDTOList(VehicleTypeMapperImpl.java:81) ~[classes/:na]
at br.com.meuveiculocerto.business.mapper.VehicleTypeMapperImpl.vehicleTypetoVehicleTypeDTO(VehicleTypeMapperImpl.java:33) ~[classes/:na]
at br.com.meuveiculocerto.business.mapper.BrandMapperImpl.brandtoBrandDTO(BrandMapperImpl.java:35) ~[classes/:na]
at br.com.meuveiculocerto.business.mapper.VehicleTypeMapperImpl.brandListToBrandDTOList(VehicleTypeMapperImpl.java:81) ~[classes/:na]

谁能帮我确定它循环播放的原因?

您在 VehicleTypeBrand 之间存在循环依赖。您有 3 种可能性来解决循环:

  1. 一个映射器将始终忽略循环字段。我看到 VehicleTypeBrand 的列表中有 @JsonIgnore。您可以在映射器中通过 Mapping#ignore 忽略它们。

  2. 您将拥有忽略不需要的内容的显式映射,并使用限定符来选择适当的方法。有关限定符 here 的更多信息,请参阅文档

  3. 使用最新版本的 1.2.0(在回答 1.2.0.RC1 时使用新的 @Context 参数。看看 mapping-with-cycles 来自 mapstruct 示例存储库。它解决了循环映射问题。您不必使用 Object,也可以使用您的特定类型。

注意:1.2.0版本不提供"out of the box"循环映射的解决,需要用户明确解决。