在使用 @Mapping
注解进行对象映射时,如果目标类中存在与源类同名的变量,可能会导致映射不正常工作。这是因为默认情况下,MapStruct 会尝试将源类的属性直接映射到目标类的同名属性上。如果目标类中的属性有特殊的命名或需要不同的映射逻辑,就需要使用自定义的映射方法。
MapStruct 是一个 Java 库,用于生成类型安全的 Bean 映射类。它通过注解处理器在编译时生成映射代码,从而提高性能并减少运行时的错误。
@Mapping 注解用于指定源属性到目标属性的映射关系。
@Mapping
。当目标类中存在与源类同名的变量时,可能会出现以下问题:
@Mapping
指定自定义映射可以通过 @Mapping
注解指定源属性到目标属性的自定义映射路径。
@Mapper
public interface MyMapper {
@Mapping(source = "sourceField", target = "targetField")
TargetObject map(SourceObject source);
}
@Named
注解进行自定义方法映射如果需要更复杂的映射逻辑,可以定义一个自定义的映射方法,并使用 @Named
注解来引用它。
@Mapper
public interface MyMapper {
@Mapping(source = "sourceField", target = "targetField", qualifiedByName = "customMapping")
TargetObject map(SourceObject source);
@Named("customMapping")
default String customMappingMethod(String sourceField) {
// 自定义映射逻辑
return "Custom: " + sourceField;
}
}
假设有以下两个类:
public class SourceObject {
private String sourceField;
// getters and setters
}
public class TargetObject {
private String targetField;
// getters and setters
}
使用 MapStruct 进行映射:
@Mapper
public interface MyMapper {
@Mapping(source = "sourceField", target = "targetField")
TargetObject map(SourceObject source);
}
如果目标类中的 targetField
需要特殊的处理,可以使用自定义方法:
@Mapper
public interface MyMapper {
@Mapping(source = "sourceField", target = "targetField", qualifiedByName = "customMapping")
TargetObject map(SourceObject source);
@Named("customMapping")
default String customMappingMethod(String sourceField) {
// 自定义映射逻辑
return "Custom: " + sourceField;
}
}
通过使用 @Mapping
和 @Named
注解,可以灵活地处理源对象和目标对象之间的属性映射,尤其是在目标类中存在与源类同名变量时。这样可以确保映射的正确性和灵活性。
领取专属 10元无门槛券
手把手带您无忧上云