2017-01-09 8 views
0

Я новичок в весенней загрузке и пытается создать демонстрационное приложение. Я хотел бы подключиться к базе данных mysql, используя содержимое гибернации и выборки из таблицы. Это то, что моя структура проекта выглядит следующим образом:Невозможно Autowire интерфейс, который расширяет CRUD-репозиторий

Project Structure in Eclipse

Класс DemoApplication.java выглядит следующим образом:

package com.example; 

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

@SpringBootApplication 
public class DemoApplication { 

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

HibernateTestController.java выглядит следующим образом:

package com.example.controllers; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 

import com.example.repositories.PatchRepository; 

@Controller 
public class HibernateTestController { 

    @Autowired 
    PatchRepository patchRepository; 

    @RequestMapping(value={"/hibernateTest"}) 
    public ModelAndView home() { 
     //List<Patch> patches = patchRepository.findAll(); 
     return new ModelAndView("hibernateTest"); 
    } 
} 

PatchRepository.java выглядит так:

package com.example.repositories; 
import java.util.List; 

import org.springframework.data.repository.CrudRepository; 
import org.springframework.stereotype.Repository; 

import com.example.models.Patch; 

@Repository 
public interface PatchRepository extends CrudRepository<Patch, Long> { 
    List<Patch> findAll(); 
} 

Теперь, когда я запустить приложение, я получаю сообщение об ошибке сказав:

************************** * ПРИМЕНЕНИЕ нЕ НАЧАТЬ


Описание:

поле patchRepository в com.example.controllers.HibernateTestController требуется боб из типа 'com.example.repositories.PatchRepository', который не мог быть е ound.

Действие:

Рассмотрим определение боб типа 'com.example.repositories.PatchRepository' в вашей конфигурации.

Я не могу понять, почему Autowire для PatchRepository не работает. Я думаю, что моя структура проекта правильная и что PatchRepository должен автоматически обнаруживаться весной в качестве компонента.

Это то, что pom.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 

http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

<groupId>com.example</groupId> 
<artifactId>demo</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>demo</name> 
<description>Demo project for Spring Boot</description> 

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.2.RELEASE</version> 
    <relativePath /> 
</parent> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    <java.version>1.8</java.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-cache</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jersey</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</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.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <optional>true</optional> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.webjars</groupId> 
     <artifactId>jquery</artifactId> 
     <version>3.1.1-1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.webjars</groupId> 
     <artifactId>bootstrap</artifactId> 
     <version>3.3.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.1-api</artifactId> 
     <version>1.0.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-commons-core</artifactId> 
     <version>1.4.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-jpa</artifactId> 
     <version>1.10.6.RELEASE</version> 
    </dependency> 
</dependencies> 

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

+0

Вам не нужна аннотация @Repository на интерфейсе, и вы должны удалить метод findAll, так как Crud Репозиторий уже содержит такой метод с другим типом возврата. –

+0

@JensSchauder - Я сделал то, что вы предложили, и это не имело значения. Я все равно получаю ту же ошибку. – Nikhil

+0

Добавьте вопрос 'pom.xml' к вопросу. –

ответ

-1

Я переработан мой код следующим образом и все работало:

package com.example.repositories; 
import java.util.List; 

import org.springframework.data.repository.CrudRepository; 
import org.springframework.stereotype.Repository; 

import com.example.models.Patch; 
public interface PatchRepository extends CrudRepository<Patch, Long> { 
    List<Patch> findAll(); 
} 


    <?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example</groupId> 
    <artifactId>demo</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>demo</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.3.RELEASE</version> 
     <relativePath /> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.webjars</groupId> 
      <artifactId>jquery</artifactId> 
      <version>3.1.1-1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.webjars</groupId> 
      <artifactId>bootstrap</artifactId> 
      <version>3.3.7</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 
    </dependencies> 

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


</project> 


    spring.thymeleaf.cache: false 

##DB connections## 
spring.datasource.url=jdbc:mysql://localhost/testdb 
spring.datasource.username=root 
spring.datasource.password=root 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

# Keep the connection alive if idle for a long time (needed in production) 
spring.datasource.testWhileIdle = true 
spring.datasource.validationQuery = SELECT 1 

# Hibernate Configuration 
spring.jpa.hibernate.ddl-auto=update 
packagesToScan=com.example 
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
hibernate.show_sql=false 
hibernate.format_sql=true 

# Naming strategy 
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy 

entitymanager.packagesToScan=com.example 

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is 
# stripped before adding them to the entity manager) 

#logging.level.org.springframework.web=DEBUG 
#logging.level.org.hibernate=DEBUG 



package com.example.controllers; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 

import com.example.models.Patch; 
import com.example.repositories.PatchRepository; 

@Controller 
public class HibernateTestController { 

    @Autowired 
    PatchRepository patchRepository; 

    @RequestMapping(value={"/hibernateTest"}) 
    public ModelAndView home() { 
     List<Patch> patches = patchRepository.findAll(); 
     return new ModelAndView("hibernateTest"); 
    } 
} 

Application.properties выглядит следующим образом:

spring.thymeleaf.cache: false 

##DB connections## spring.datasource.url=jdbc:mysql://localhost/testdb spring.datasource.username=root spring.datasource.password=root 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

# Keep the connection alive if idle for a long time (needed in production) spring.datasource.testWhileIdle = true 
spring.datasource.validationQuery = SELECT 1 

# Hibernate Configuration spring.jpa.hibernate.ddl-auto=update packagesToScan=com.example 
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
hibernate.show_sql=false hibernate.format_sql=true 

# Naming strategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy 

entitymanager.packagesToScan=com.example 

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is 
# stripped before adding them to the entity manager) 

#logging.level.org.springframework.web=DEBUG 
#logging.level.org.hibernate=DEBUG 
+0

, и что именно вы изменили, что заставляет его работать? –

+0

@AdrianShum - Раньше я использовал файл DatabaseConfig.java для инициализации dataSource. Я избавился от класса DatabaseConfig и переместил всю инициализацию спящего режима на application.properties. – Nikhil

-1

Убедитесь, что у вас есть

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

и

<dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
    </dependency> 

в вашем pom.xml

Правильные конфиги

spring.datasource.url=jdbc:mysql://localhost:3306/test 
spring.datasource.username=root 
spring.datasource.password=root 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

И ваш класс Patch помечается @Entity и имеют Id атрибута аннотированный с @Id.

Все должно работать.

+0

Не взялся за то, почему получил downvote. Это минимальная конфигурация, которую вам нужно, чтобы иметь возможность autwire и использовать интерфейс, который расширяет CrudRepository. –

0

попробуйте использовать сканирование хранилища в классе DemoApplication

@SpringBootApplication 
@EnableJpaRepositories("com.example.repositories") 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 
} 
Смежные вопросы