首页 > 解决方案 > 在列表中注入所有映射器并以多态方式调用转换方法

问题描述

有没有一种方法可以自动装配在 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);
}

但这不起作用。 你有什么建议吗?我可能一起误解了这一切......谢谢。

标签: mapstruct

解决方案


结帐:https ://github.com/mapstruct/mapstruct-spring-extensions

作者根据this SO issue中的讨论制作和适配器。

可以在此处找到基于非弹簧的解决方案。尽管您需要编写自己的注释处理器。


推荐阅读