如果您的 2 种类型TypeDest
不是TypeSrc
在运行时生成的,即它们是您编译的类,那么您可以实现您想要的。MapStruct 不能在运行时工作,因为它是一个注解处理器并生成 java 代码。如果存在一些问题,例如您尝试映射不存在的字段或存在不明确的映射方法,那么您将收到编译时错误。
它看起来像:
@Mapper
public interface MyMapper {
@Mapping(source = "mySourceField", target = "myTargetField", qualifiedByName = "myTransformation")// or you can use a custom @Qualifier annotation with qualifiedBy
TypeDest toSiteCatTag(TypeSrc obj);
@Named("myTransformation")// or your custom @Qualifier annotation
default Integer myCustomTransformation(String obj) {
return Formatter.toSquare(Formatter.toInteger(obj));
}
}
有一种方法可以在没有映射器中的自定义方法的情况下做到这一点,但是您需要在某个地方有一个方法来应用toInteger
然后toSquare
转换。如果您Integer squaredString(String obj)
的Formatter
.
例如
@Qualifier
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface SquaredString {}
public class Formatter {
@SquaredString// you can also use @Named, this is just as an example
public static Integer squaredString(String obj) {
return toSquare(toInteger(obj));
}
//your other methods are here as well
}
然后您可以在映射器中执行此操作:
@Mapper(uses = { Formatter.class })
public interface MyMapper {
@Mapping(source = "mySourceField", target = "myTargetField", qualifiedBy = SquaredString.class)
TypeDest toSiteCatTag(TypeSrc obj);
}
qualifedByName
由于使用了/ ,因此上述示例仅适用于特定映射qualified
。如果您想有一种不同的方式将 a 转换String
为Integer
,那么您可以在您的 Mapper 或Mapper#uses
带有签名的某些类中定义一个方法Integer convertString(String obj)
。然后 MapStruct 会将转换 from String
to委托Integer
给此方法。
您可以在参考文档中找到有关使用限定符进行映射的更多信息,在此处了解有关映射方法解析的更多信息。