【发布时间】:2021-07-12 05:43:21
【问题描述】:
道层。我有抽象的 jpa dao 接口,扩展接口,并添加了抽象实现,从中我扩展了其他实际使用的实现。这些类如下:
public interface AbstractDao<E> {
E findById(Long id);
List<E> findAll();
void save(E entity);
void update(E entity);
void delete(E entity);
void deleteById(Long entityId);
}
public interface UserDao extends AbstractDao<User> {
}
public abstract class AbstractDaoImpl<E> implements AbstractDao<E> {
private final Class<E> clazz;
@PersistenceContext
protected EntityManager entityManager;
public AbstractDaoImpl(Class<E> clazz) {
this.clazz = clazz;
}
@Override
public E findById(Long id) {
return entityManager.find(clazz, id);
}
@SuppressWarnings("unchecked")
@Override
public List<E> findAll() {
return entityManager
.createQuery("from " + clazz.getName())
.getResultList();
}
@Override
public void save(E entity){
entityManager.persist(entity);
}
@Override
public void update(E entity){
entityManager.merge(entity);
}
@Override
public void delete(E entity) {
entityManager.remove(entity);
}
@Override
public void deleteById(Long entityId){
E entity = findById(entityId);
delete(entity);
}
}
@Repository
public class UserDaoImpl extends AbstractDaoImpl<User> implements UserDao {
public UserDaoImpl() {
super(User.class);
}
}
服务层。这里我也有抽象服务接口,一个扩展接口(UserService)及其抽象和真实的实现:
public interface AbstractService<E, DTO> {
E findById(Long id);
List<E> findAll();
void save(E entity);
void update(E entity);
void delete(E entity);
void deleteById(Long entityId);
DTO convertToDTO(E entity);
}
public interface UserService extends AbstractService<User, UserDTO> {
}
@Getter @Setter @AllArgsConstructor
public abstract class AbstractServiceImpl<E, D extends AbstractDao<E>, DTO> implements AbstractService<E, DTO> {
private D dao;
private ModelMapper mapper;
@Override
public E findById(Long id) {
return dao.findById(id);
}
@Override
public List<E> findAll() {
return dao.findAll();
}
@Override
public void save(E entity) {
dao.save(entity);
}
@Override
public void update(E entity) {
dao.update(entity);
}
@Override
public void delete(E entity) {
dao.delete(entity);
}
@Override
public void deleteById(Long entityId) {
dao.deleteById(entityId);
}
}
@Service
public class UserServiceImpl extends AbstractServiceImpl<User, UserDao, UserDTO> implements UserService {
@Autowired
public UserServiceImpl(UserDao dao, ModelMapper mapper) {
super(dao, mapper);
}
@Override
public UserDTO convertToDTO(User entity) {
return getMapper().map(entity, UserDTO.class);
}
}
在我的实际项目中,我从 AbstractDao 和 AbstractServie 获得了许多扩展接口。您可以看到实际的层次结构:
我不明白为什么 spring 不能创建 @Service 注释的 bean 并在我的控制器中自动装配它们。任何帮助将不胜感激。
【问题讨论】:
-
你能发布堆栈跟踪吗?
-
不幸的是,我达到了字符的限制。所以这是我的堆栈跟踪github.com/tuanalexeu/JavaSchoolFinalTask/issues/3的github问题的链接@
标签: java spring tomcat model-view-controller