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]
谁能帮我确定它循环播放的原因?
您在 VehicleType
和 Brand
之间存在循环依赖。您有 3 种可能性来解决循环:
一个映射器将始终忽略循环字段。我看到 VehicleType
中 Brand
的列表中有 @JsonIgnore
。您可以在映射器中通过 Mapping#ignore
忽略它们。
您将拥有忽略不需要的内容的显式映射,并使用限定符来选择适当的方法。有关限定符 here 的更多信息,请参阅文档
使用最新版本的 1.2.0
(在回答 1.2.0.RC1
时使用新的 @Context
参数。看看 mapping-with-cycles 来自 mapstruct 示例存储库。它解决了循环映射问题。您不必使用 Object
,也可以使用您的特定类型。
注意:1.2.0
版本不提供"out of the box"循环映射的解决,需要用户明确解决。
我正在使用 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]
谁能帮我确定它循环播放的原因?
您在 VehicleType
和 Brand
之间存在循环依赖。您有 3 种可能性来解决循环:
一个映射器将始终忽略循环字段。我看到
VehicleType
中Brand
的列表中有@JsonIgnore
。您可以在映射器中通过Mapping#ignore
忽略它们。您将拥有忽略不需要的内容的显式映射,并使用限定符来选择适当的方法。有关限定符 here 的更多信息,请参阅文档
使用最新版本的
1.2.0
(在回答1.2.0.RC1
时使用新的@Context
参数。看看 mapping-with-cycles 来自 mapstruct 示例存储库。它解决了循环映射问题。您不必使用Object
,也可以使用您的特定类型。
注意:1.2.0
版本不提供"out of the box"循环映射的解决,需要用户明确解决。