当前位置: 首页 > 知识库问答 >
问题:

MapStruct:自定义映射函数应用于所有字段

左丘积厚
2023-03-14

我有一个自定义映射函数,它将int映射到String,但我只想在一个特殊情况下应用它。但是,它适用于所有int类型的源字段,而不仅仅是用java(…)注释的源字段。

源类:

class Source {
    private int a;
    private int b;
    // getters etc...
}

目标类别:

class Target {
    private String a;
    private String b;
    // getters etc...
}

映射器:

@Mapping(source="a", target="a") // should not be necessary, but to make it more explicit
@Mapping(target="b", expression = "java(modify(b))")
public abstract Target sourceToTarget(Source source);

String modify(int value) {
    return "prefix_" + value;
}

我想要实现的目标:

target.setA(String.valueOf(a));
target.setB(modify(b));

但是,生成的代码会执行以下操作:

target.setA(modify(a));
target.setB(modify(b));

删除表达式并进行修改时,映射结构对这两个值都使用字符串.valueOf。我尝试了地图结构1.4.2.最终以及1.5.2.最终。这两个类都使用龙目岛,但是,这在过去并不是一个问题。

这种行为是预期的吗?如果是的话,我还能怎么做?

共有1个答案

颛孙正卿
2023-03-14

有两种方法可以尝试:

--

@Mapper(componentModel = "spring")
public interface ExampleMapper {

    @Mapping(target = "b", expression = "java(modify(source.getB()))")
    @Mapping(target = "a", expression = "java(String.valueOf(source.getA()))")
    Target sourceToTarget(Source source);

    default String modify(int value) {
        return "prefix_" + value;
    }
}

它生成了以下代码:

@Component
public class ExampleMapperImpl implements ExampleMapper {

    @Override
    public Target sourceToTarget(Source source) {
        if ( source == null ) {
            return null;
        }

        Target target = new Target();

        target.setB( modify(source.getB()) );
        target.setA( String.valueOf(source.getA()) );

        return target;
    }
}

--

@Mapper(componentModel = "spring")
public interface ExampleMapper {

    @Mapping(source = "a", target = "a")
    @Mapping(target = "b", qualifiedByName = "any-name")
    Target sourceToTarget(Source source);

    @Named("any-name")
    default String modify(int value) {
        return "prefix_" + value;
    }
}

注意:我在< code>modify(int value)方法上使用了< code>@Named,因此它不能被任何映射使用,除非通过< code>qualifiedByName提到。

它生成了以下代码:

@Component
public class ExampleMapperImpl implements ExampleMapper {

    @Override
    public Target sourceToTarget(Source source) {
        if ( source == null ) {
            return null;
        }

        Target target = new Target();

        target.setA( String.valueOf( source.getA() ) );

        target.setB( modify(source.getB()) );

        return target;
    }
}
 类似资料:
  • 以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 我有一个映射定义为 其中定义如下: 反向映射是使用处理的。如何为反向映射指定自定义映射?

  • 我试图找到一个更好的解决方案,以防止Hibernate代理初始化时,通过MapSTRt将实体映射到响应DTO。 我一直在将我们的代码库转换为使用ModelMapper中的MapStruct。如果我想用ModelMapper完成我的要求,我可以做如下简单的事情: 自定义getter方法允许我检查是否已经从数据库中获取了字段,以避免N 1次初始化。 它看起来像: 我不能简单地覆盖普通的getter,因

  • 怎么做?没有找到可以基于类型动态映射的示例。我发现这种方法在、Google中都非常方便。感谢你的帮助!

  • 假设我有这些实体: null