java - SpringBoot : create object from generic type in generic mapper

标签 java spring spring-boot generics

我有很多实体扩展 Catalog 实体,并且有很多 dto CatalogDto

Catalog Entity

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

我的存储库:

@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 方法中从 Dto 创建一个对象

最佳答案

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

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

关于java - SpringBoot : create object from generic type in generic mapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64919906/

相关文章:

java - 基于PHP的网络爬虫或基于JAVA的网络爬虫

java - 如何在 java 类中获取 TextView 值作为字符串并设置它?

java - 如何在使用 Spring Data JPA nativeQuery 时用参数值替换表名称

Spring:基于 Java 配置的 session 超时

java - 登录关系型数据库并扩展日志接口(interface)

javascript - 定时自动更新 JSP 页面

java - 无法降低从 Rideable 继承的方法的可见性

java - 我如何将两个字符串数组放入 ListView 中具有多个对象类型的数组列表中

java - Spring Boot Soap 集成测试失败

java - 如何使用 Spring Boot 在后端跟踪文件下载进度?