Spring 无法创建 UserService bean

Spring cannot create UserService bean

道层。我有抽象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 中的项目 https://github.com/tuanalexeu/JavaSchoolFinalTask

问题是您如何初始化 spring 上下文,根本没有读取 AppConfig 上下文。此上下文包含您的所有配置。

通过修改您的初始化程序以将您的 AppConfig 包含为根,所有 bean 都应该存在于相同的上下文中。 (您也可以选择拥有父 -> 子上下文,但这也应该在初始化程序中完成)。希望能帮助到你。祝你好运。

public class MainWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(final ServletContext sc) throws ServletException {

        AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
        root.register(AppConfig.class);
        
        Dynamic servlet = sc.addServlet("dispatcher", new DispatcherServlet(root));
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");

        sc.addListener(new ContextLoaderListener(root));
        sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain"))
                .addMappingForUrlPatterns(null, false, "/*");

    }
}