Java MapStruct无法从泛型集属性中找到成员
我开始使用MapStructJava 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
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
是包含私有集扫描的一个,所以我希望扫描。同位素
可以工作。像素完美!谢谢你的提示!