错误需要找不到类型为 'XXX' 的 bean

Error required a bean of type 'XXX' that could not be found

我正在通过添加一个名为 news 的页面来更新 spring 启动项目,但它有以下错误。

Field newsService in com.lrs.admin.controller.NewsController required a bean of type 'com.lrs.admin.service.INewsService' that could not be found.

代码如下: Application.java

@MapperScan("com.lrs.admin.dao")
@ServletComponentScan
@SpringBootApplication
public class Application extends SpringBootServletInitializer implements EmbeddedServletContainerCustomizer{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

NewController.java

@Controller
@RequestMapping("/news")
public class NewsController extends BaseController {
    private final static String qxurl="news/list";
    
    @Autowired
    private INewsService newsService;

INewsService.java

package com.lrs.admin.service;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Componnt;
import com.lrs.admin.util.ParameterMap;

    @Component
    public interface INewsService {
        public List<ParameterMap> list();
        public Map<String,Object> getNews(ParameterMap pm);
        public Map<String,Object> edit(ParameterMap pm); 
        public Map<String,Object> add(ParameterMap pm,HttpSession session); 
        public Map<String,Object> del(String newsId); 
    }

NewsService.java

public class NewsService implements INewsService {

    @Autowired
    private NewsDao newsDao;
    

NewsDao.java

public interface NewsDao {
    public List<ParameterMap> list();
    public List<ParameterMap> getAllNewsById(ParameterMap pm);
    public ParameterMap getNewsById(ParameterMap pm);
    public void updateNews(ParameterMap pm);
    public void addNews(ParameterMap pm);
    public void delNews(String roleId);
//  public void delUserRole(String roleId);
}

NewsMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lrs.admin.dao.NewsDao">

</mapper>

我只是创建了那些文件,并没有实现任何方法yet.Is这是为什么?有什么帮助吗?谢谢。

您应该在实现接口的 class 上注释 @Service 而不是接口本身。即把NewsService注解为@Service,就可以把INewsService

中的@Component标签去掉

我们从不在界面上放置@Component(或@Service,...),因为这会使界面无用。让我解释一下为什么。

  • 如果您有一个接口,那么您想将该接口用于注入点类型。

  • 接口的目的是定义一个可以由多个实现实现的契约。在另一侧,您有注入点 (@Autowired)。只有一个接口和实现它的 class 是没有用的。

您必须从 INewsService 中删除 @Component 注释并在 NewsService class 中添加 @Service 注释,因为 Spring 试图实例化它创建一个 Bean @Service,但它是一个接口,所以这是不可能的。

尝试从您的 INewsService.java 中删除此 @Component 并将 @Service 添加到 NewsService.java 它将解决错误并且更加全面,原因 @Component@Repository@Service@Controller.

的概括

@Component : 任何 Spring-managed 组件的通用构造型

@Repository : 持久层的原型

@Service : 服务层的原型

@Controller : 表示层的原型 (spring-mvc)