Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java mapstruct中使用的按名称限定的方法是';t用于自动生成的实现_Java_Spring_Spring Boot_Spring Data Jpa_Mapstruct - Fatal编程技术网

Java mapstruct中使用的按名称限定的方法是';t用于自动生成的实现

Java mapstruct中使用的按名称限定的方法是';t用于自动生成的实现,java,spring,spring-boot,spring-data-jpa,mapstruct,Java,Spring,Spring Boot,Spring Data Jpa,Mapstruct,我有以下DTO和实体类: @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class CType { private Integer id; // ...... private VType vType; } 我需要用mapstruct映射这些类的对象,这是我的mapstruct: @Mapper 公共接口VCMapper{ @映射({ @映射(target=“cType”,qualified

我有以下DTO和实体类:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CType {

    private Integer id;
    // ......
    private VType vType;
}

我需要用mapstruct映射这些类的对象,这是我的mapstruct:

@Mapper
公共接口VCMapper{
@映射({
@映射(target=“cType”,qualifiedByName=“formVType”)
})
CType toCType(CTypeEntity CTypeEntity);
列表类型(列表类型实体);
@映射({
@映射(target=“vTypeId”,source=“vType.id”)
})
CTypeEntity fromCType(CType CType);
列表来自cTypeList(列表cTypes);
@命名(“formVType”)
默认VType formVType(CTypeEntity实体,@Context VTypeDao VTypeDao){
返回vTypeDao.findById(entity.getVId());
}
}
问题:当我使用maven(
mvn clean package
)构建应用程序时,自动生成的
VCMapperImpl
类中方法
toCType()
的实现没有使用限定的
formVType()
默认方法

问题:

  • 为什么在impl类中不使用限定的默认方法
  • 默认方法和它在Mapper接口中的用法有什么问题,如何修复
不使用限定的
formVType
方法的原因是
@Context
属性。原始方法中没有此类属性,因此MapStruct将与该方法不匹配。如果将其添加到
toCType
中,则将使用它

为了不拖拽
VTypeDao
,我建议您使用
抽象类并将其注入其中

例如

@Mapper
公共抽象类VCMapper{
受保护的VTypeDao VTypeDao;
@映射({
@映射(target=“cType”,qualifiedByName=“formVType”)
})
公共摘要CType toCType(CTypeEntity CTypeEntity);
公共抽象类型列表(列表cTypeEntities);
@映射({
@映射(target=“vTypeId”,source=“vType.id”)
})
公共抽象CTypeEntity fromCType(CType CType);
cTypeList中的公共摘要列表(列表cTypes);
@命名(“formVType”)
受保护的VType formVType(CTypeEntity实体){
返回vTypeDao.findById(entity.getVId());
}
公共void setVTypeDao(VTypeDao VTypeDao){
this.vTypeDao=vTypeDao
}
}

不幸的是,建议的选项都不起作用。嗨,Armine,你找到这个问题的解决方案了吗。有同样的问题。不,我没有找到一个好的解决方案,我只是克服了它:我从formVType()的第二个参数中删除了@Context,每次在我的dao或任何地方调用toCType()时,我都会通过传递适当的dao对象手动调用formVType()。不太好,但当时那是最快的方法。kind a希望得到这种答案,也会得到同样的结果;)谢谢你的答复
@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;
}
@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()); 
    }
}
@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
    }
}