MapStruct 是一个用于生成类型安全且易于使用的对象映射代码的框架。它通过注解处理器在编译时生成映射代码,从而避免了运行时的反射开销。不可修改的模型类通常指的是那些一旦创建后其状态就不能被改变的类,例如使用 final
关键字修饰的类或使用 Collections.unmodifiableList
等方法创建的集合。
MapStruct 支持多种类型的映射,包括基本类型、集合、嵌套对象等。对于不可修改的模型类,MapStruct 可以生成相应的映射代码,确保目标对象也是不可修改的。
在需要将一个对象的属性映射到另一个对象的场景中,尤其是当目标对象是不可修改的模型类时,MapStruct 非常有用。例如,在数据传输对象(DTO)和领域模型之间的转换,或者在微服务架构中不同服务之间的数据转换。
原因:
解决方法:
@Mapping(target = "property", ignore = true)
忽略某些属性,或者使用 @AfterMapping
注解在映射完成后进行必要的处理。@Mapping(source = "sourceProperty", target = "targetProperty")
进行显式映射。假设有两个类 Source
和 Target
,其中 Target
是不可修改的模型类:
public class Source {
private String name;
private int age;
// getters and setters
}
public final class Target {
private final String name;
private final int age;
public Target(String name, int age) {
this.name = name;
this.age = age;
}
// getters
}
使用 MapStruct 进行映射:
@Mapper
public interface SourceTargetMapper {
SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);
@Mapping(target = "name", source = "name")
@Mapping(target = "age", source = "age")
Target toTarget(Source source);
}
在 Target
类中添加一个静态工厂方法:
public final class Target {
private final String name;
private final int age;
private Target(String name, int age) {
this.name = name;
this.age = age;
}
public static Target of(String name, int age) {
return new Target(name, age);
}
// getters
}
修改映射器:
@Mapper
public interface SourceTargetMapper {
SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);
@Mapping(target = "name", source = "name")
@Mapping(target = "age", source = "age")
Target toTarget(Source source);
default Target map(Source source) {
return Target.of(source.getName(), source.getAge());
}
}
领取专属 10元无门槛券
手把手带您无忧上云