Для поля bookRepository в com.code.service.BookServiceImpl требуется компонент типа com.myAppp.code.respository.BookRepository, который не может быть найден - PullRequest
0 голосов
/ 04 июня 2018

Я получаю сообщение об ошибке при попытке создать / запустить приложение SpringBoot следующим образом:

Field bookRepository in com.myApp.code.service.BookServiceImpl required a bean of type 'com.myApp.code.respository.BookRepository' that could not be found.

Рассматриваемый репозиторий:

package com.myApp.code.respository;

import com.myApp.code.model.Book;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {    
}

И в классе обслуживания у меня есть следующее:

package com.myApp.code.service;

import com.myApp.code.model.Book;
import com.myApp.code.respository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

    @Service
    public class BookServiceImpl implements BookService {   

        @Autowired
        private BookRepository bookRepository;

        @Override
        public void list() {
            //return bookRepository.findAll();
            for (Book book : bookRepository.findAll()) {
                System.out.println(book.getTitle());
            }
        }

В соответствующем контроллере у меня есть:

@Controller
@RequestMapping(value="book")
public class BookController {

    @Autowired         
    private BookService bookService;    
    @Autowired   
    private PersonService personService;  
    @Autowired
    private BookValidator bookValidator;      

    private final Logger LOG = LoggerFactory.getLogger(getClass().getName());

    public BookController() {       
    }

    // Displays the catalogue.
    @RequestMapping(value="/catalogue", method=RequestMethod.GET)
    public String index(Model model) {           
        LOG.info(BookController.class.getName() + ".catalogue() method called."); 

        // Populate catalogue.        
        bookService.list();      
//        model.addAttribute("books", books);   

        // Set view.                  
        return "/catalogue";               
    }  

А в файле Application.java у меня есть:

@SpringBootApplication
@EnableJpaRepositories
@ComponentScan(basePackages="com.myApp.code")
public class Application {

    private final Logger LOG = LoggerFactory.getLogger(getClass().getName());


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

Класс Book:

@Entity
@Table(name="BOOK")
public class Book implements Serializable {

    // Fields.
    @Id
    @Column(name="id", unique=true, nullable=false)
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column(name="AUTHOR", nullable=false, length=50)
    private String author;

    @Column(name="TITLE", nullable=false, length=100)
    private String title;

    @Column(name="DESCRIPTION", nullable=false, length=500)
    private String description;

    @Column(name="ONLOAN", nullable=false, length=5)
    private String onLoan;

    @ManyToOne(fetch=FetchType.EAGER, targetEntity = Person.class)
    @JoinColumn(name="Person_Id", nullable=true)    
    private Person person;

Мой файл POM Maven:

<dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
        </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.apache.derby</groupId>
            <artifactId>derbyclient</artifactId>
            <version>10.14.2.0</version>
        </dependency>      
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Может кто-нибудь сказать мне, почему я получаю это сообщение?Класс BookRepository существует в конце концов.

1 Ответ

0 голосов
/ 04 июня 2018

Spring boot будет искать только репозитории, сущности и компоненты в пределах одного пакета или подпакета основного класса (Application).Вы уже добавили @ComponentScan для указания на другой пакет, но вы также должны добавить пакет к @EntityScan и @EnableJpaRepositories, например:

@SpringBootApplication
@EnableJpaRepositories("com.myApp.code") // Add this
@EntityScan("com.myApp.code") // Add this 
@ComponentScan(basePackages="com.myApp.code")
public class Application {
    // ...
}

Это также упоминается в JpaRepository не реализован / внедрен, когда в отдельном пакете от компонентов может .

В качестве альтернативы, , как упомянуто в комментариях , вы можете поместить основной класс в com.myApp.code.

Поместите свой класс Application в пакет com.myApp.code, а не в дополнительный пакет.- М. Дейн

Этим вы можете удалить все три аннотации:

@SpringBootApplication // Other annotations can be removed
public class Application {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...