Spring Boot 如何修复“字段...需要类型为...的Bean,但无法找到”异常Sping Boot

zd287kbt  于 2023-02-22  发布在  Spring
关注(0)|答案(7)|浏览(191)

我正在使用 javabrains 中的Spring Boot 教程,直到把CrudRepository放进项目中,一切都很清楚。

package pl.springBootStarter.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

服务等级:

package pl.springBootStarter.app.topic;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class TopicService
{
    @Autowired
    private TopicRepository topicRepository;

    private List<Topic> topics =  new ArrayList<>(Arrays.asList(
            new Topic("spring","spring framework", "spring framework dectription"),
            new Topic("sprin","spring framework", "spring framework dectription"),
            new Topic("spri","spring framework", "spring framework dectription")));

    public  List<Topic> getAllTopics()
    {
    //    return topics;
    List<Topic> t = new ArrayList<Topic>();
    topicRepository.findAll().forEach(t::add);
    return t;
    }

    public Topic getTopic (String id)
    {
        return   topics.stream().filter( t -> t.getId().equals(id)).findFirst().get();
    }

    public void addTopic(Topic topic) {
        topicRepository.save(topic);
    }

    public void updateTopic(Topic topic, String id)
    {
        topics.set(topics.indexOf(topics.stream().filter(t-> t.getId().equals(id)).findFirst().get()), topic);
    }

    public void deleteTopic(String id)
    {
        topics.remove(topics.stream().filter(t -> t.getId().equals(id)).findFirst().get());
    }
}

Repository接口:

package pl.springBootStarter.app.topic;

import org.springframework.data.repository.CrudRepository;

public interface TopicRepository extends CrudRepository<Topic,String>
{

}

当我运行应用程序时,将TopicRepository注入TopicService类中的topicRepository字段时出现问题。我收到以下错误:

Error starting ApplicationContext. To display the conditions report re-       run your application with 'debug' enabled.
2019-05-01 10:33:52.206 ERROR 6972 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field topicRepository in pl.springBootStarter.app.topic.TopicService required a bean of type 'pl.springBootStarter.app.topic.TopicRepository' that could not be found.

The injection point has the following annotations:
-    @org.springframework.beans.factory.annotation.Autowired(required=true)

Spring不能自动安装的原因可能是什么?

ergxz8rk

ergxz8rk1#

请确保通过Spring扫描类!

(this如果这就是问题所在的话Intellij Springboot在启动时出现问题)。
或者,您可能希望将TopicRepository注解为@Repository

@Repository
public interface TopicRepository extends CrudRepository<Topic,String>
{
}

请在此处查看演示代码:https://github.com/lealceldeiro/repository-demo

2vuwiymt

2vuwiymt2#

Spring无法注入bean,因为它尚未创建。
您必须指示Spring通过在任何配置类或用@SpringBootApplication标注的类上使用@EnableJpaRepositories(basePackages={"pl.springBootStarter.app"})标注来生成已声明的存储库接口的实现,这应该可以解决您的问题。

w1jd8yoj

w1jd8yoj3#

我收到了一条类似的消息,我错过了服务类中的@服务注解。简单的错误,张贴以防它帮助其他人。

hgncfbus

hgncfbus4#

对于任何通过Google搜索generic bean错误消息,但实际上试图通过客户端界面上的@FeignClient注解将***伪客户端***添加到其Sping Boot 应用程序的人来说,以上解决方案都不适用。
要解决这个问题,您需要将@EnableFeignClients注解添加到Application类中,如下所示:

@SpringBootApplication
// ... (other pre-existing annotations) ...
@EnableFeignClients // <------- THE IMPORTANT ONE
public class Application {
7hiiyaii

7hiiyaii5#

我也收到了类似的信息。
问题是我的主包是com.example,其他类的包是com.xyz
所以当我其他类的包名改为com.example.topic
例如,finally主包是com.example,另一个类的包是com.example.topic
一个简单的错误,张贴的情况下,它有助于其他人。

2sbarzqh

2sbarzqh6#

在我的例子中,来自org.springframework.boot.autoconfigure.jdbc.的必要配置在SpringBootApplication中被排除,导致相关bean不能正确添加。检查您的主应用程序java文件,看看您是否可以在排除列表中找到以下配置

import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;

@SpringBootApplication(
    exclude = {
        DataSourceAutoConfiguration.class,                      // REMOVE THIS
        DataSourceTransactionManagerAutoConfiguration.class,    // REMOVE THIS
    }
)

并将其从排除列表中删除。

siv3szwd

siv3szwd7#

在服务类中执行:@自动连线(必填=假)

相关问题