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