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

自动映射除一个字段外的所有字段,该字段应通过其他函数传递

龚彬
2023-03-14

使用Mapstruct,我如何创建一个映射器,自动映射除一个(或两个、三个等)字段外的所有字段,这些字段应该通过一些自定义映射逻辑传递?

制图员

@Mapper
public interface MyEntityMapper
{
    MyEntityMapper INSTANCE = Mappers.getMapper(MyEntityMapper.class);

    @Mappings(
        {
            @Mapping(source = "createdByPerson.id", target = "createdByPersonId"),
        })
    MyEventPayload toEventPayload(MyEntity entity);
}

如果我有一个someString字段,需要先做一些自定义映射日志记录,我该怎么做?我看到了参数@Mapping选项,但在注释中的字符串中编写java代码似乎有点疯狂!

我希望做一些类似的事情:

@MappingFor(MyEntity.class, "someString")
default String mapSomeString(String value) {
    return value + " custom mapping ";
}

更新

我找到了@AfterMapping,并使用了它,例如:

@AfterMapping
public void mapSomeString(MyEntity entity, MyEventPayload payload) {
    // do fancy stuff here
}

但是我仍然很好奇您是否可以提供每个字段的后映射/自定义映射功能。

共有3个答案

充普松
2023-03-14

我最终使用了@AfterMapping,例如:

@AfterMapping
public void mapSomeString(MyEntity entity, MyEventPayload payload) {
    // do fancy stuff here
}
经和歌
2023-03-14

你看了Map结构的表达式吗?

以下是文档中的示例:

@Mapping(target = "timeAndFormat",
     expression = "java( new org.sample.TimeAndFormat( s.getTime(), s.getFormat() ) )")

您可以使用类构造函数或方法来代替neworg.sample.TimeAndFormat...

方和豫
2023-03-14

如果要以特定方式映射单个字段,可以使用基于限定符的映射方法选择。

这看起来有点像

@Mapper
public interface MyEntityMapper {

    @Mapping(target = "someString", qualifiedByName = "myFancyMapping")
    MyEventPayload toEventPayload(MyEntity entity);

    @Named("myFancyMapping") // org.mapstruct.Named
    default String mapSomeString(String value) {
        return value + " custom mapping ";
    }
}

您还可以使用Mapping#QualiedBy并构造自己的限定符org.mapstruct.限定符)注释。

这看起来像:

@Qualifier // org.mapstruct.Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface MyFancyMapping {
}

@Mapper
public interface MyEntityMapper {

    @Mapping(target = "someString", qualifiedBy = MyFancyMapping.class)
    MyEventPayload toEventPayload(MyEntity entity);

    @MyFancyMapping
    default String mapSomeString(String value) {
        return value + " custom mapping ";
    }
}

另一种方法是在@AfterMap中或使用表达式进行自定义映射(我不建议使用表达式,因为它容易出错)。

 类似资料:
  • 我有一个自定义映射函数,它将映射到,但我只想在一个特殊情况下应用它。但是,它适用于所有int类型的源字段,而不仅仅是用注释的源字段。 源类: 目标类别: 映射器: 我想要实现的目标: 但是,生成的代码会执行以下操作: 删除表达式并进行时,映射结构对这两个值都使用。我尝试了地图结构以及。这两个类都使用龙目岛,但是,这在过去并不是一个问题。 这种行为是预期的吗?如果是的话,我还能怎么做?

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 选择MySQL中除一列以外的所有列? 我想知道是否有一种方法可以从数据库的表中选择除一个字段以外的所有其他字段。 我知道我可以在选择查询中描述字段名称。 例如: 但是我的问题是,有没有办法以一种简单的方式做到这一点呢? 我正在使用MySQL和Zend框架。 问题答案: 你可以很容易做到 假设您的字段是id = 5 然后 如果你的

  • Navicat 会依源表或集合对字段类型和長度作出假设。你可以从下拉式菜单选择你所需的类型。 【提示】导入多个表或集合时,你可以从下拉式菜单选择其他表或集合。 如果你导入数据到现有的表或集合,你则需要手动映射源字段名到目标,或按住 Control 键并点按字段,然后选择“智慧匹配全部字段”、“按次序匹配全部字段”和“全部取消匹配”来进行快速匹配。 如果你透过 ODBC 导入,“条件式查询”按钮会打

  • 我把这三门课分别放在不同的文件中 我有下面的映射器 这目前仅映射lastName并起作用,我想将Book中的作者字符串映射为 我怎么能这么做?我在MapStruct文档中找不到任何东西。

  • 我与ModelMapper框架有麻烦。请解释为什么我看到以下行为。 我在build.gradle有以下依赖性 和一个类客户: 我还有一个地图绘制工具: 还有一个测试 在fred()中,方法输出是非红色的“Customer{name=fred,age=40}”(“Customer{name=null,age=40}”)。你能解释一下为什么吗?为什么我在第一个方法中看不到输出“George”?

  • “想要解决方案B” 有什么办法可以做到这一点吗?