我有以下DTO和Entity类:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CType {
private Integer id;
// ......
private VType vType;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "c_types")
public class CTypeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
private Integer id;
// ......
@Column(name = "v_type_id")
private Integer vTypeId;
}
我需要使用 mapstruct 映射这些类的对象,这是我的 mapstruct :
@Mapper
public interface VCMapper {
@Mappings({
@Mapping(target = "cType", qualifiedByName = "formVType")
})
CType toCType(CTypeEntity cTypeEntity);
List<CType> toCTypes(List<CTypeEntity> cTypeEntities);
@Mappings({
@Mapping(target = "vTypeId", source = "vType.id")
})
CTypeEntity fromCType(CType cType);
List<CTypeEntity> fromCTypeList(List<CType> cTypes);
@Named("formVType")
default VType formVType(CTypeEntity entity, @Context VTypeDao vTypeDao) {
return vTypeDao.findById(entity.getVId());
}
}
问题::当我使用Maven(mvn clean package
)构建应用程序时,自动生成的toCType()
类中的方法VCMapperImpl
的实现没有实现使用合格的formVType()
默认方法。
问题:
答案 0 :(得分:1)
之所以不使用合格的formVType
方法,是因为@Context
属性。原始方法中没有这样的属性,因此MapStruct将不匹配该方法。如果将其添加到toCType
,则将使用它。
为了不拖拉VTypeDao
,建议您使用abstract
类并将其注入其中。
例如
@Mapper
public abstract class VCMapper {
protected VTypeDao vTypeDao;
@Mappings({
@Mapping(target = "cType", qualifiedByName = "formVType")
})
public abstract CType toCType(CTypeEntity cTypeEntity);
public abstract List<CType> toCTypes(List<CTypeEntity> cTypeEntities);
@Mappings({
@Mapping(target = "vTypeId", source = "vType.id")
})
public abstract CTypeEntity fromCType(CType cType);
public abstract List<CTypeEntity> fromCTypeList(List<CType> cTypes);
@Named("formVType")
protected VType formVType(CTypeEntity entity) {
return vTypeDao.findById(entity.getVId());
}
public void setVTypeDao(VTypeDao vTypeDao) {
this.vTypeDao = vTypeDao
}
}