我在实体和DTO之间有一个映射器:
@Mapper(componentModel="cdi", uses = { RegionMapper.class })
public interface ClusterMapper {
@Mapping(target="regions", ignore=true)
ClusterDto map(Cluster entity);
ClusterDto mapWithRegions(Cluster entity);
}
Run Code Online (Sandbox Code Playgroud)
第一个映射函数是列出实体的"简单映射",第二个映射函数用于详细视图.我想要List等价,所以我有一个注释:
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Simple {
}
Run Code Online (Sandbox Code Playgroud)
并将此限定符添加到第一个映射函数和List函数:
@Mapper(componentModel="cdi", uses={RegionMapper.class})
public interface ClusterMapper {
@Simple // <====
@Mapping(target="regions", ignore=true)
ClusterDto map(Cluster entity);
ClusterDto mapWithRegions(Cluster entity);
@IterableMapping(qualifiedBy = Simple.class) // <====
List<ClusterDto> map(List<Cluster> entities);
}
Run Code Online (Sandbox Code Playgroud)
但即使使用@Simple注释,我也会收到一条错误消息:
找到用于将集合元素映射到...的模糊映射方法
如何使List map(List)功能"选择"第一个映射功能?
我必须使用mapstruct映射抽象实体列表,但我不知道如何操作,因为我有以下错误消息:
无法为此方法生成任何实现.找不到将源元素类型映射到目标元素类型的方法或隐式转换.
public class AbstractArea {
private List<AbstractArea> areas;
public List<AbstractArea> getAreas() {
return areas;
}
public void setAreas(List<AbstractArea> areas) {
this.areas = areas;
}
}
@Mapper()
public interface AbstractAreaMapper {
...
List<AbstractAreaDto> abstractAreasToAbstractAreaDtos(List<AbstractArea> areaList);
}
Run Code Online (Sandbox Code Playgroud) 在尝试映射我的域对象时,我收到以下 StackOverflowError 异常。我试图忽略导致循环依赖无效的属性。
我的域模型的中心是 WorkoutSet,它有一个 User 和一个练习。
如果我从 WorkoutSetMapper 中删除映射注释,则 UserMapperImpl 和 ExerciseMapperImpl 将按预期生成。
错误:(15, 1) java:映射处理器中的内部错误:com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) 处的 java.lang.StackOverflowError 在 com.sun.tools .javac.code.Types$UnaryVisitor.visit(Types.java:4652) at com.sun.tools.javac.code.Types.supertype(Types.java:2315) at com.sun.tools.javac.code.Types $13.visitClassType(Types.java:1966) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1955) at com.sun.tools.javac.code.Type$ClassType.accept(Type .java:786) 在 com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) 在 com.sun.tools.javac.code.Types.asSuper(Types.java:1952) 在com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1968) 在 com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1955) 在 com.sun.tools。代码。Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) at com.sun.tools.javac.code.Types.asSuper( Types.java:1952) 在 com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1975) 在 com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1955)在 com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) 在 com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) 在 com.sun .tools.javac.code.Types.asSuper(Types.java:1952) 在 com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1975) 在 com.sun.tools.javac.code。 Types$13.visitClassType(Types.java:1955) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit (类型.java:4571) 在 com.sun.tools.javac.code.Types.asSuper(Types.java:1952) 在 com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1975) 在 com.sun。 tools.javac.code.Types$13.visitClassType(Types.java:1955) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code .Types$DefaultTypeVisitor.visit(Types.java:4571) at com.sun.tools.javac.code.Types.asSuper(Types.java:1952) …
我有一种情况,我在 DTO 中有另一个 DTO,我必须将其映射到其相应的实体。
我正在使用 mapstruct 并且我已经有另一个实体映射器。
DTO
public class EntityDTO {
private AnotherEntityDTO anotherEntityDTO;
// other fields
}
Run Code Online (Sandbox Code Playgroud)
Entity
@Entity
public class Entity {
private AnotherEntity anotherEntity;
// other fields
}
Run Code Online (Sandbox Code Playgroud)
如何更改 EntityMapper 接口,以便我可以将 anotherEntityDTO 映射到 anotherEntity?
谢谢。
通过使用将一个对象类型转换为另一个对象类型的mapstruct,我可以成功地从枚举到枚举使用.
不幸的是,我无法将Enum转换为Boolaen.我得到以下错误.
"不能映射属性'ChoiceType isPriceHigh’到'java.lang.Boolean的isPriceHigh’考虑到声明/实现的映射方法:'java.lang.Boolean的地图(ChoiceType值)’.
这是我在mapstruct中使用的方法.任何帮助将不胜感激.
干杯Alper
@ValueMappings({
@ValueMapping(target = "true", source = "YES"),
@ValueMapping(target = "false", source = "NO")
})
Boolean map(ChoiceType value);
Run Code Online (Sandbox Code Playgroud) 我正在尝试将实体映射Order到OrderDTO使用MapStruct.我想添加到OrderDTO一个新字段total,此字段在原始实体中不可用Order,应使用Order(订单条目价格,数量,税金......)中提供的信息进行计算.我创建了一个新的字段total,OrderDTO我试图通过向mapper接口添加一个默认方法来映射它:
public interface OrderMapper {
...
default BigDecimal orderToTotal(Order order){
return logicToCalculateTotal();
}
}
Run Code Online (Sandbox Code Playgroud)
当我午餐时,构建MapStruct会启动错误
未映射的目标属性:"总计".
知道如何解决这个问题吗?
谢谢
我试图用一个mapstruct,我需要映射Entity与子Entity列表,我有关系,oneToMany而且manyToOne,我需要在这两种情况下的映射:
@Data
@Entity
public class EmailEntity {
private int id;
... // some fields
@ManyToOne
private DeliveredEmailInfoEntity deliveredEmailInfo;
}
Run Code Online (Sandbox Code Playgroud)
.
@Data
@Entity
public class DeliveredEmailInfoEntity {
private int id;
... // some fields
@OneToMany
private List<EmailEntity> emails;
}
Run Code Online (Sandbox Code Playgroud)
映射到:
@Data
public class EmailDTO {
private int id;
... // some fields
private DeliveredEmailInfoDTO deliveredEmailInfo;
}
Run Code Online (Sandbox Code Playgroud)
.
@Data
public class DeliveredEmailInfoDTO {
private int id;
... // some fields
private List<EmailDTO> …Run Code Online (Sandbox Code Playgroud) 我有一个下游服务,我想将其 bean 映射到我的 bean。但是使用mapstruct似乎有问题。
来自下游服务的 Pojo(我无法更改其定义)
@ToString
@Getter
@Setter
@Accessors(fluent = true)
public class PojoA {
private String stringA;
private int integer;
}
Run Code Online (Sandbox Code Playgroud)
我想把它转换成 PojoB
@Setter
@Getter
@ToString
public class PojoB {
private String stringB;
private int integer;
}
Run Code Online (Sandbox Code Playgroud)
映射器接口
@Mapper
public interface PojoMapper {
PojoMapper INSTANCE = Mappers.getMapper(PojoMapper.class);
@Mapping(source = "stringA", target = "stringB")
PojoB pojoAToPojoB(PojoA pojoA);
}
Run Code Online (Sandbox Code Playgroud)
这失败了,因为它无法找到 getter 作为 fluent 从 getter 中删除前缀,我知道 mapstruct 生成映射器接口的实现并使用 bean 规范(即获取和设置前缀)
有没有办法克服它?
在他们的文档中(这里:http ://mapstruct.org/documentation/dev/api/org/mapstruct/AfterMapping.html),他们提到 @AfterMapping 可以与 @Qualifier / @Named 一起使用来过滤,但我不能在任何地方都找不到如何以这种方式实际使用它。
我最好的猜测是像这样使用它:
@Mapper
public abstract class CustomerMapper {
@Named("Test")
public abstract Customer map(CustomerDto dto);
@Named("Test")
@AfterMapping
public void doAfterMapping(@MappingTarget Customer customer) {
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎没有任何作用(如果我删除了 @Named 注释,它可以工作,但它也用于我不想要的其他方法中)。有谁知道需要如何使用它?
我有这个映射器,我想将实体转换为 DTO。我的实体包含变量 createdDate ,他是 Instant ,我的 DTO 包含 commentedDate ,他是时间戳。
我不知道如何通过 MapStruct 将 Instant 自动转换为 Timestamp。
public interface BlogMapper {
@Mappings({
@Mapping(target = "userId", source = "user.id"),
@Mapping(target = "commentedDate", source = "createdDate")
})
BlogDto entityToDto(final Comment entity);
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助 :)