java mapstruct详解_java – MapStruct:丰富映射注释以定义自定义映射器

这是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将对象转换为另一个对象.我遇到了一些问题,我想找到另一种方法,就是我发现MapStruct的方法.

所以我尝试构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数.比如我想:

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

}

如果有人可以帮助我实现这一目标,我将感激不尽,这将节省我很多时间.

提前致谢.

解决方法:

如果在运行时没有生成2种TypeDest和TypeSrc,即它们是您编译的类,那么您可以实现您想要的. MapStruct在运行时不起作用,因为它是一个Annotation Processor并生成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转换.如果在Formatter中有一个带有签名Integer squaredString(String obj)的方法.

例如

@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中执行此操作:

@Mapper(uses = { Formatter.class })

public interface MyMapper {

@Mapping(source = "mySourceField", target = "myTargetField", qualifiedBy = SquaredString.class)

TypeDest toSiteCatTag(TypeSrc obj);

}

由于使用了qualifedByName / qualified,因此上述示例仅适用于特定映射.如果你想有一种不同的方法将String转换为Integer,那么你可以在Mapper中或Mapper#中的一些类中使用签名Integer convertString(String obj)定义一个方法.然后,MapStruct将从String转换为Integer到此方法.

您可以在参考文档中找到有关使用限定符here进行映射的更多信息,有关映射方法解析的更多信息,请参见here.

标签:java,mapstruct

来源: https://codeday.me/bug/20190611/1217397.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值