2016-07-21 13 views
0

私はSpring Boot初心者です。コントローラとThymeleafテンプレートを持つシンプルなアプリケーションがあります。Springブート `org.springframework.beans.factory.BeanCreationException:自動生成された依存関係のBeanインジェクションに失敗しました。

アプリケーションが起動すると、すべてが機能しているかどうかを確認するために、RepoTesterと呼ばれるSpring ApplicationListenerを実行して、サービスクラスのメソッドをチェックする必要があります。サービスクラスは、PersonRepositoryのメソッドを呼び出し、これは単にSpringのCrudRepositoryを拡張します。しかし、私は、アプリケーションを実行してみるに行くたびに、それは私にメッセージを与えて倒れる:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repoTester': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private webapps.city2016.micro.code.service.PersonService webapps.city2016.micro.code.bootstrap.RepoTester.personService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private webapps.city2016.micro.code.repo.PersonRepository webapps.city2016.micro.code.service.PersonServiceImpl.personRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [webapps.city2016.micro.code.repo.PersonRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

しかし、私は、なぜ見ることができません。

ApplicationListenerクラスは単純です:

@Component 
public class RepoTester implements ApplicationListener<ContextRefreshedEvent> { 

@Autowired 
private PersonService personService; 

private static final Logger logger = Logger.getLogger(RepoTester.class); 

@Override 
public void onApplicationEvent(ContextRefreshedEvent event) { 
    logger.info(RepoTester.class.getName() + ".onApplicationEvent() method called."); 

    // Create Person. 
    Person person = new Person(); 
    person.setName("Cleo Markham"); 
    person.setAddress("48 Alysbury Road"); 
    person.setTelephone("34561287"); 
    person.setEmail("[email protected]"); 
    person = personService.save(person);   

Personクラスは単純です:各属性のgettersetter方法では

public class Person { 

    // Attributes.  
    private Integer personId; 
    private String name; 
    private String address; 
    private String telephone; 
    private String email; 

アプリケーションはまた、プロパティファイルには、Derbyデータベースを使用するように指定するapplication.propertiesを呼びかけている:

spring.datasource.driverClassName=org.apache.derby.jdbc.ClientDriver 
spring.datasource.url=jdbc:derby://localhost:1527/Library 
spring.datasource.username=username 
spring.datasource.password=password 

サービスクラスのコードは単純です:

@Service() 
public class PersonServiceImpl implements PersonService { 

    @Autowired 
    private PersonRepository personRepository; 

    private static final Logger logger = Logger.getLogger(PersonServiceImpl.class); 

    public PersonServiceImpl() { 
    } 

    @Override 
    public void delete(Integer personId) { 
     logger.info(PersonServiceImpl.class.getName() + ".delete() method called."); 

     personRepository.delete(personId); 
    } 

    @Override 
    public boolean exists(Integer personId) { 
     logger.info(PersonServiceImpl.class.getName() + ".exists() method called."); 

     return personRepository.exists(personId); 
    } 

    @Override 
    public Person findOne(Integer personId) { 
     logger.info(PersonServiceImpl.class.getName() + ".findOne() method called."); 

     return personRepository.findOne(personId); 
    } 

    @Override 
    public Iterable<Person> findAll() { 
     logger.info(PersonServiceImpl.class.getName() + ".findAll() method called."); 

     return personRepository.findAll(); 
    } 

    @Override 
    public Person save(Person person) { 
     logger.info(PersonServiceImpl.class.getName() + ".save() method called."); 

     return personRepository.save(person); 
    }  

とリポジトリは、次のとおりです。

package webapps.city2016.micro.code.repo; 

import org.springframework.data.repository.CrudRepository; 

import webapps.city2016.micro.code.model.Person; 

public interface PersonRepository extends CrudRepository<Person, Integer> { 
} 

マイMavenファイル:

http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0 RegistrationSpringBootThymeleaf1 1.0-SNAPSHOT 瓶 webapps.city2016.micro
UTF-8 1.8 1.8

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

<dependencies> 
    <dependency> 
     <groupId>org.apache.derby</groupId> 
     <artifactId>derbyclient</artifactId> 
     <version>10.12.1.1</version> 
    </dependency>  
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jdbc</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-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter</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> 

<name>RegistrationSpringBootThymeleaf1</name> 

私が間違っているところ誰が助言することはできますか?

答えて

0

私は両方の回答を投稿しましたが、成功しなかったので、アプリケーションは手動で作成されたDAOクラスでSpring JDBCに変換され、完全に機能します。

JPAに関するアドバイスはありますが、歓迎します。

0

あなたはJPAアノテーションで人に注釈を付ける必要があります。

@Entity 
@Table(name = "person") 
public class Person { 

    // Attributes.  
    private Integer personId; 
    private String name; 
    private String address; 
    private String telephone; 
    private String email; 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Integer getPersonId() { ... } 

    @Basic 
    @Column(name = "name") 
    public String getName() { ... } 
+0

同じ問題が、残念ながら発生します。 –

+0

すべてのゲッターに注釈を付けましたか?また、EnableJpaRepositoriesを設定ファイルに戻しましたか? –

+0

実際の変数のゲッターに注釈が付けられても、プロジェクトはまだ失敗します。 –

0

あなたがここにすべての要件を読むことができます: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-jpa-and-spring-data

をそれとも、このチュートリアルで述べているすべて行っていることを確認してください。 http://spring.io/guides/gs/accessing-data-jpa/

特に確認してください:

    @SpringBootApplication @Entity
  • @Idとし、タイプがあなたのリポジトリ(整数)のジェネリック医薬品の種類と一致していることを注釈付きエンティティの主キーの注釈を付け
  • Entityクラスの注釈が付け
  • メインクラス。
  • エンティティおよびリポジトリのクラスは、メインクラスまたはそれ以下のパッケージレベルにあります。
+0

メインクラス:。。。' Entity' @でアノテートはいEntityクラス:はい主キーを...はい:あなたのエンティティとリポジトリのクラス:はい。そして、悲惨なアプリケーションはまだ失敗します! –

関連する問題