SpringBoot应用程序中没有可用类型的合格Bean

时间:2019-09-08 01:56:31

标签: spring spring-boot

运行SpringBoot应用程序时,出现此错误:

  

运行时发生异常。 null:InvocationTargetException:创建名称为'bookController'的bean时出错:通过字段'bookRepository'表示的不满意的依赖关系;嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为'com.example.experimental001.Repositories.BookRepository'的合格Bean:预计至少有1个有资格作为自动装配候选的Bean。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}-> [帮助1]

我已经阅读了许多有关此错误的文章,但似乎都没有一个能解决我的问题。

我尝试添加@Controller批注,但似乎无法解决Bean问题。

控制器:

<html>
  <body>
    <table id="myTable">
            <tr class="header">
                <th onclick="sortTable(0)" style="width:6%;">Col1</th>
                <th onclick="sortTable(1)" style="width:9%;">Col2</th>
                <th onclick="sortTable(2)" style="width:85%;">Col3</th>
            </tr>
            <tr>
              <td>1</td>
              <td>2</td>
              <td>
                <table class="table table-bordered">
                  <tbody>
                    <tr>
                      <th>Col One</th>
                      <th>Col Two</th>
                      <th>Col Three</th>
                    </tr>
                    <tr>
                      <td>One</td>
                      <td>Two</td>
                      <td>Three</td>
                    </tr>
                  </tbody>
                </table>
              </td>
    </table>
  </body>
</html>

简单控制器:

@RestController
@RequestMapping("/api/books")
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    @GetMapping
    public Iterable findAll() {
        return bookRepository.findAll();
    }

    @GetMapping("/title/{bookTitle}")
    public List findByTitle(@PathVariable String bookTitle) {
        return bookRepository.findByTitle(bookTitle);
    }

    @GetMapping("/{id}")
    public Book findOne(@PathVariable Long id) {
        return bookRepository.findById(id)
                .orElseThrow(() -> new BookNotFoundException("Book not found", null));
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Book create(@RequestBody Book book) {
        return bookRepository.save(book);
    }

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id) {
        bookRepository.findById(id).orElseThrow(() -> new BookNotFoundException("Book not found", null));
        bookRepository.deleteById(id);
    }

    @PutMapping("/{id}")
    public Book updateBook(@RequestBody Book book, @PathVariable Long id) {
        if (book.getId() != id) {
            throw new BookIdMismatchException("error");
        }
        bookRepository.findById(id).
                orElseThrow(() -> new BookNotFoundException("Book not found", null));
        return bookRepository.save(book);
    }
}

存储库:

@Controller
public class SimpleController {
    @Value("${spring.application.name}")
    String appName;
    @GetMapping("/")
    public String homePage(Model model) {
        model.addAttribute("appName", appName);
        return "home";
    }
}

Pom:

@EnableJpaRepositories
@Repository

public interface BookRepository extends CrudRepository<Book, Long> {
    public List<Book> findByTitle(String title);
}

应用文件:

<properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1 个答案:

答案 0 :(得分:0)

您可能需要将以下内容添加到主应用程序类:

@ComponentScan(basePackages =“存储库所在的软件包”)

看起来您的存储库位于另一个包装器中,并且启动时spring上下文无法将其提取。

请参阅此文档:https://www.baeldung.com/spring-component-scanningfor