Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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无法从泛型集属性中找到成员_Java_Mapstruct - Fatal编程技术网

Java MapStruct无法从泛型集属性中找到成员

Java MapStruct无法从泛型集属性中找到成员,java,mapstruct,Java,Mapstruct,我开始使用MapStruct1.4.0.CR1。我也在使用Gradle: dependencies { annotationProcessor("org.mapstruct:mapstruct-processor:${project.property("mapstruct.version")}") implementation("org.mapstruct:mapstruct:${project.property("mapst

我开始使用MapStruct
1.4.0.CR1
。我也在使用Gradle:

dependencies {
  annotationProcessor("org.mapstruct:mapstruct-processor:${project.property("mapstruct.version")}")

  implementation("org.mapstruct:mapstruct:${project.property("mapstruct.version")}")
}
我正在尝试映射一些JPA实体:

公共类考试实现可序列化{
//这里有更多的班级成员
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“检查”,orphan=true)
专用集扫描;
public Exam(){}/…JPA不需要参数构造函数
公开考试(期末考试){
//……其他的也要安排
scans=builder.scans;
}
//getter(无setter)、hashCode、equals和builder
}
公共类扫描实现可序列化{
//这里有更多的班级成员
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“scan”,orphan=true)
专用报警装置;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“scan”,orphan=true)
私有同位素;
受保护的扫描(){}/…JPA不需要参数构造函数
公共扫描(最终构建器){
//……其他的也要安排
报警=builder.alarms;
同位素=builder.同位素;
}
//getter(无setter)、hashCode、equals和builder
}
我有类似的映射类,但它们没有JPA实体那么多的字段/成员,而且它们位于完全不同的子系统上(因此映射)。问题是MapStruct告诉我在
Scan
s:
java:源参数中不存在名为“scans.isotopes”的属性。你是说“扫描。清空”吗?

基本上,
同位素
报警
不包含在(新)映射的
检查
类中的
扫描集
中。这是我的
examapper

@functioninterface
@映射器(componentModel=“spring”,injectionStrategy=injectionStrategy.CONSTRUCTOR)
公共接口ExamMapper{
//@Mapping(source=“scans.alarms”,target=“alarms”)
@映射(source=“scans.isotopes”,target=“isotopes”)
检查值来自(tld.domain.Exam实体);
}

有没有办法做到这一点?我认为这可能很琐碎,但我对MapStruct;)还是相当陌生的

映射的
目标
属性只能引用bean属性

这意味着当使用
scans.isotopes
时,它将在
Set
中查找属性
isotopes
,从而查找编译错误

为了解决这个问题,您需要提供一些自定义映射。据我所知,你也需要在这里做平面贴图。原因是你有多个扫描,每个扫描都有多个同位素。您需要收集所有这些信息并将其映射到单个集合中

实现这一目标的一种方法是:

@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface ExamMapper {

  @Mapping(source = "scans", target = "isotopes")
  Exam valueFrom(tld.domain.Exam entity);

  Isotope valueFrom(tld.domain.Isotope isotope);

  default Set<Isotope> flatMapIsotopes(Set<Scan> scans) {
    return scans.stream()
        .flatMap(scan -> scan.getIsotopes().stream())
        .map(this::valueFrom)
        .collect(Collectors.toSet());
  }
 
}

@Mapper(componentModel=“spring”,injectionStrategy=injectionStrategy.CONSTRUCTOR)
公共接口ExamMapper{
@映射(source=“scans”,target=“同位素”)
检查值来自(tld.domain.Exam实体);
同位素值来自(tld.domain.同位素);
默认设置flatMapIsotopes(设置扫描){
返回scans.stream()
.flatMap(扫描->扫描.getSotopes().stream())
.map(this::valueFrom)
.collect(收集器.toSet());
}
}

您试图映射到的其他考试和扫描类是什么样子的?我不需要对映射类进行
扫描
;我可以用这些更新问题,但重要的是,
扫描集在映射的
检查中消失了,因此
同位素的集合和
警报成为新
检查
类的一部分/成员,但不在任何其他成员内(最初是这样).啊,我想我知道这里出了什么问题,
映射
注释的源参数必须是参数内的路径,您传递该方法。在您的例子中,源代码将位于
tld.domain.Exam
的确,这也是我的想法。基本上
tld.domain.Exam
是包含
私有集扫描的一个,所以我希望
扫描。同位素
可以工作。像素完美!谢谢你的提示!