簡體   English   中英

SpringBoot:從泛型映射器中的泛型類型創建對象

[英]SpringBoot: create object from generic type in generic mapper

我有很多實體擴展Catalog實體,並且有很多 d 到那個程度CatalogDto

目錄實體

我有一個通用的存儲庫、服務和映射器,如下所示

我的存儲庫:

@Repository
public interface CatalogRepository<T extends Catalog> extends JpaRepository<T, Integer>{
}

我的服務:

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

我的映射器:

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

我想從dtoToEntity方法中的 T 創建一個對象,並在CatalogMapper類的entityToDto方法中從dtoToEntity創建一個對象

我認為這兩種方法應該是抽象的,因為每個映射器可能以不同的方式工作。 無論如何,您可以提供這樣的基本實現

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM