Java SpringBoot:从泛型映射器中的泛型类型创建对象

Java SpringBoot:从泛型映射器中的泛型类型创建对象,java,spring,spring-boot,generics,Java,Spring,Spring Boot,Generics,我有很多实体扩展了Catalog实体,也有很多数据扩展到CatalogDto 我有一个通用的存储库、服务和映射器,如下所示 我的存储库: @Repository public interface CatalogRepository<T extends Catalog> extends JpaRepository<T, Integer>{ } @存储库 公共接口CatalogRepository扩展了JpaRepository{ } 我的服务: @Service @T

我有很多实体扩展了
Catalog
实体,也有很多数据扩展到
CatalogDto

我有一个通用的存储库、服务和映射器,如下所示

我的存储库:

@Repository
public interface CatalogRepository<T extends Catalog> extends JpaRepository<T, Integer>{
}
@存储库
公共接口CatalogRepository扩展了JpaRepository{
}
我的服务:

@Service
@Transactional
public class CatalogServiceImpl<T extends Catalog,Dto extends CatalogDto>{
    private final Logger log = LoggerFactory.getLogger(CatalogServiceImpl.class);

    private final CatalogRepository<T> repository;
    private CatalogMapper<T,Dto> catalogMapper=new CatalogMapper<T,Dto>() {};

    public CatalogServiceImpl(CatalogRepository<T> repository) {
        this.repository = repository;
    }
}
@服务
@交易的
公共类CatalogServiceImpl{
私有最终记录器日志=LoggerFactory.getLogger(CatalogServiceImpl.class);
私有最终目录库;
私有CatalogMapper CatalogMapper=新CatalogMapper(){};
公共CatalogServiceImpl(目录存储库){
this.repository=存储库;
}
}
我的地图绘制者:

public abstract class CatalogMapper<T extends Catalog,Dto extends CatalogDto> implements Rapper<T,Dto> {
    @Override
    public Dto entityToDto(T entity) {
        return null;
    }

    @Override
    public T dtoToEntity(Dto dto) {
        return null;
    }
}
公共抽象类CatalogMapper实现Rapper{
@凌驾
公共Dto实体TODTO(T实体){
返回null;
}
@凌驾
公共Dto实体(Dto Dto){
返回null;
}
}

我想在
dtoToEntity
方法中从T创建一个对象,在
entityToDto
方法中从Dto创建一个对象,在
CatalogMapper
class

中,我认为这两个方法应该是抽象的,因为每个映射器可能以不同的方式工作。无论如何,您可以提供这样的基本实现

public T dtoToEntity(Dto dto) throws InstantiationException, IllegalAccessException {
    T entity = (T) ((Class)((ParameterizedType)this.getClass().
               getGenericSuperclass()).getActualTypeArguments()[0]).newInstance();
    BeanUtils.copyProperties(dto, entity);
    return entity;
}

public Dto entityToDto(T entity) throws InstantiationException, IllegalAccessException {
    Dto dto = (Dto) ((Class)((ParameterizedType)this.getClass().
               getGenericSuperclass()).getActualTypeArguments()[1]).newInstance();
    BeanUtils.copyProperties(entity, dto);
    return dto;
}

使用泛型类的ParameterizedType,您可以创建一个新实例,然后执行一个简单的copyProperties

我尝试了不同的方法,但无法准确地执行哪个和如何执行?谢谢,但运行时出现了错误
sun.reflect.generics.reflectiveObjects.TypeVariableImpl无法转换为位于***.mapper.CatalogMapper.dtoToEntity的java.lang.Class