自动映射除一个字段以外的所有字段,这些字段应通过其他功能传递

时间:2019-01-08 19:08:30

标签: java mapstruct

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

映射器

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

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

如果我有一个someString字段,需要首先完成一些自定义映射日志记录,我该怎么做?我看到argument的这个@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 个答案:

答案 0 :(得分:1)

如果要以特定方式映射单个字段,可以使用clang

这看起来像

@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#qualifiedBy并构建自己的Qualifierorg.mapstruct.Qualifier)注释。

这看起来像:

@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 ";
    }
}

替代

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

答案 1 :(得分:0)

您是否看过MapStruct的Expressions

以下是文档中的示例:

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

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

答案 2 :(得分:0)

我最终使用了@AfterMapping例如:

constexpr