mapstruct - 在列表中注入所有映射器并以多态方式调用转换方法
问题描述
有没有一种方法可以自动装配在 Spring 中使用 Mapstruct 编写的所有映射器,就像我们过去使用 Spring Converter 接口并调用一个 toEntity(或 convert 或任何其他名称)一样?在 spring 中,这很容易,因为它们都实现了相同的功能接口,并且通过使其从另一个接口继承,我们可以在运行时确定正确的转换器,如下所示:
import org.springframework.core.convert.converter.Converter;
public interface CustomConverter<S extends ..., T extends ...> extends Covnerter<S,T>{
boolean supports(Class clazz);
}
然后注入它会很容易:
@Autowire
private final List<CustomConverter> myConverters;
通过调用 support,我们将确定正确的转换器类型,然后针对它调用 convert。我有这样的想法:
@Mapper
public interface MyMapper extends CustomMapper<MyEntity, MyDto>{
MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);
MyEntity toEntity(MyDto dto);
default boolean supports(Class clazz) {
return MyDto.class.isAssignableFrom(clazz);
}
和
public interface CustomMapper<T extends ..., S extends ...> {
boolean supports(Class clazz);
T toEntity(S dto);
}
但这不起作用。 你有什么建议吗?我可能一起误解了这一切......谢谢。
解决方案
结帐:https ://github.com/mapstruct/mapstruct-spring-extensions
作者根据this SO issue中的讨论制作和适配器。
可以在此处找到基于非弹簧的解决方案。尽管您需要编写自己的注释处理器。
推荐阅读
- javascript - 在折叠时显示 lineleft 节点
- regex - 如何使用 REEXTRACT 提取两个字符串之间的某些字符
- c# - 当我更改继承类中同名方法的代码时,我不需要使用属性覆盖和虚拟。这是为什么?
- c# - 多个 XSD/CLass 对象的接口
- flutter - 我在列中有几个扩展的小部件。首先我展开一个小部件。当我展开第二个时,第一个应该自动折叠
- c# - .Net Core -C#- AWS SQS - 用于获取 QueueMessages 的 StarAsync 和 ExecuteAsync 方法的不同行为
- vue.js - vuejs 2 和 webpack 4 的一些问题
- amazon-web-services - 允许使用 boto3 到 EC2 的入站 SSH 流量
- javascript - 是否可以在接口 Props 中添加任何值以在 React Typescript 中进行初始化?
- javascript - 试图在 promise 中模拟数据返回会导致 jest 超时