使用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
}
但是我仍然很好奇您是否可以提供按字段的映射后/自定义映射功能。
答案 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
并构建自己的Qualifier
(org.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