首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当目标具有与源同名的变量时,@Mapping与自定义源和目标变量的映射不能正常工作

在使用 @Mapping 注解进行对象映射时,如果目标类中存在与源类同名的变量,可能会导致映射不正常工作。这是因为默认情况下,MapStruct 会尝试将源类的属性直接映射到目标类的同名属性上。如果目标类中的属性有特殊的命名或需要不同的映射逻辑,就需要使用自定义的映射方法。

基础概念

MapStruct 是一个 Java 库,用于生成类型安全的 Bean 映射类。它通过注解处理器在编译时生成映射代码,从而提高性能并减少运行时的错误。

@Mapping 注解用于指定源属性到目标属性的映射关系。

相关优势

  1. 类型安全:在编译时检查映射的正确性。
  2. 性能高:生成的映射代码是直接的方法调用,没有反射的开销。
  3. 易于使用:通过简单的注解配置即可实现复杂的映射逻辑。

类型与应用场景

  • 简单映射:源对象和目标对象属性名相同,可以直接使用 @Mapping
  • 复杂映射:需要自定义映射逻辑,如属性名不同、需要进行数据转换等。

遇到的问题及原因

当目标类中存在与源类同名的变量时,可能会出现以下问题:

  • 属性覆盖:如果目标类中的属性有特殊的命名或需要不同的映射逻辑,默认的映射可能会覆盖目标类中的属性。
  • 映射失败:如果源类和目标类的同名属性类型不匹配,可能会导致映射失败。

解决方法

使用 @Mapping 指定自定义映射

可以通过 @Mapping 注解指定源属性到目标属性的自定义映射路径。

代码语言:txt
复制
@Mapper
public interface MyMapper {
    @Mapping(source = "sourceField", target = "targetField")
    TargetObject map(SourceObject source);
}

使用 @Named 注解进行自定义方法映射

如果需要更复杂的映射逻辑,可以定义一个自定义的映射方法,并使用 @Named 注解来引用它。

代码语言:txt
复制
@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;
    }
}

示例代码

假设有以下两个类:

代码语言:txt
复制
public class SourceObject {
    private String sourceField;
    // getters and setters
}

public class TargetObject {
    private String targetField;
    // getters and setters
}

使用 MapStruct 进行映射:

代码语言:txt
复制
@Mapper
public interface MyMapper {
    @Mapping(source = "sourceField", target = "targetField")
    TargetObject map(SourceObject source);
}

如果目标类中的 targetField 需要特殊的处理,可以使用自定义方法:

代码语言:txt
复制
@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 注解,可以灵活地处理源对象和目标对象之间的属性映射,尤其是在目标类中存在与源类同名变量时。这样可以确保映射的正确性和灵活性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券