Java MapStruct:丰富映射注释以定义自定义映射器
以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我如何发现MapStruct的 因此,我尝试构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我希望:Java MapStruct:丰富映射注释以定义自定义映射器,java,mapstruct,Java,Mapstruct,以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我如何发现MapStruct的 因此,我尝试构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我希望: @Mapping( source = "mySourceField", sourceType = "String", target = "myTargetField", targetType =
@Mapping(
source = "mySourceField",
sourceType = "String",
target = "myTargetField",
targetType = "Integer",
transformation = {"toInteger", "toSquare"}
),
在mapper实现中,我会有如下内容:
public TypeDest toSiteCatTag(TypeSrc obj) {
if ( obj == null ) {
return null;
}
TypeDest objDest = new TypeDest();
objDest.myTargetField = Formatter.toSquare(
Formatter.toInteger(obj.mySourceField));
return objDest;
}
如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间
提前感谢。如果您的两个类型
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));
}
}
有一种方法可以在不使用映射器中的自定义方法的情况下执行此操作,但是您需要在某个地方使用一种方法,该方法将应用于Integer
,然后应用于square
转换。如果在格式化程序中有一个签名为整数平方字符串(String obj)
的方法
e、 g
然后可以在映射器中执行此操作:
@Mapper(uses = { Formatter.class })
public interface MyMapper {
@Mapping(source = "mySourceField", target = "myTargetField", qualifiedBy = SquaredString.class)
TypeDest toSiteCatTag(TypeSrc obj);
}
由于使用了qualifiedbyname
/qualified
,因此上述示例仅适用于特定映射。如果希望使用不同的方法将字符串
转换为整数
,则可以在映射器中或在映射器中的某些类中定义一个方法,并使用签名整数转换字符串(String obj)
。然后,MapStruct将从字符串
到整数
的转换委托给此方法
您可以在参考文档中找到有关使用限定符进行映射的更多信息,以及有关映射方法解析的更多信息。您在编译时是否拥有TypeDest
和TypeSrc
,或者它们是动态类?你是在运行时生成的吗?看起来很完美。非常感谢,你为我节省了很多时间:)
@Mapper(uses = { Formatter.class })
public interface MyMapper {
@Mapping(source = "mySourceField", target = "myTargetField", qualifiedBy = SquaredString.class)
TypeDest toSiteCatTag(TypeSrc obj);
}