【发布时间】:2020-07-03 18:28:03
【问题描述】:
我的目标是为 CRUD 操作使用一个通用类,这样我就不需要为我的应用程序中的每个域模型实现一个单独的类。
这一层还在我的 DTO 和域模型之间进行转换。
get 和 delete 方法工作正常。但是,我该如何实现 save 方法。如果是新实体,我需要创建一个新的泛型实例并在其上映射 DTO。
/**
* This class can be extended to use default CRUD features
*
* @param <T> domain model
* @param <V> DTO represenation of domain model
*/
@RequiredArgsConstructor
public abstract class AbstractCrudService<T extends CoreDomain, V extends CoreDTO> implements CrudStrategy<T, V>{
private final JpaRepository<T, Long> repository;
private final ModelMapper modelMapper;
private final Class<V> dtoClass;
@Override
public List<V> getAll() {
List<V> list = new ArrayList<>();
for (T item : repository.findAll()) {
list.add(modelMapper.map(item, dtoClass));
};
return list;
}
@Override
public V getById(Long id) {
T entity = getEntity(id);
return modelMapper.map(entity, dtoClass);
}
@Override
public void delete(Long id) {
repository.deleteById(id);
}
@Override
@Transactional
public void save(V dto) {
T entity = new T(); /// DOESNT WORK!!!!
// for edit operation, load existing entity from the DB
if (dto.getId() != null) {
entity = getEntity(dto.getId());
}
modelMapper.map(dto, entity);
}
@Override
public T getEntity(Long id) {
Optional<T> entity = Optional.ofNullable(repository.findById(id)
.orElseThrow(() -> new NoSuchElementException(String.format("Entity with id %s not found", id))));
return entity.get();
}
}
我的服务类如下所示:
@Service
public class Test extends AbstractCrudService<Project, ProjectDTO>{
private final ProjectRepository projectRepository;
private final ModelMapper modelMapper;
public Test(ProjectRepository projectRepository, ModelMapper modelMapper) {
super(projectRepository, modelMapper, ProjectDTO.class);
this.projectRepository = projectRepository;
this.modelMapper = modelMapper;
}
}
【问题讨论】:
-
这能回答你的问题吗? Create instance of generic type in Java?
标签: java spring-boot generics persistence crud