2015-02-24 4 views
5

Я новичок в Spring framework. Я только начал изучать следующие различные руководства (http://spring.io/guides), и я пытаюсь завершить полный учебник по веб-сервисам (http://spring.io/guides/tutorials/bookmarks/).Весенний репозиторий данных - нет подходящего компонента Инъекция

Я совсем застрял на определении JPA Datasource, потому что я получаю следующее сообщение об ошибке

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'init' defined in main.Application: Unsatisfied dependency expressed through constructor argument with index 0 of type [bookmarks.AccountRepository]: : No qualifying bean of type [bookmarks.AccountRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [bookmarks.AccountRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:464) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1111) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1006) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:961) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:950) 
    at main.Application.main(Application.java:41) 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [bookmarks.AccountRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1308) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) 
    ... 18 more 

Мой главный класс приложения является следующая

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 

    @Bean 
    public CommandLineRunner init(AccountRepository accountRepository, 
      BookmarkRepository bookmarkRepository) { 
     System.out.println("Bean!"); 
     return (evt) -> Arrays.asList(
       "jhoeller,dsyer,pwebb,ogierke,rwinch,mfisher,mpollack,jlong".split(",")) 
       .forEach(
         a -> { 
          Account account = accountRepository.save(new Account(a, 
            "password")); 
          bookmarkRepository.save(new Bookmark(account, 
            "http://bookmark.com/1/" + a, "A description")); 
          bookmarkRepository.save(new Bookmark(account, 
            "http://bookmark.com/2/" + a, "A description")); 
         }); 
    } 

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

И мой pom.xml -

<?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>org.test</groupId> 
    <artifactId>demo</artifactId> 
    <version>0.0.1</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.2.1.RELEASE</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <start-class>demo.DemoApplication</start-class> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</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-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 
    </dependencies> 

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

</project> 

Я понимаю, что рамки инъекции зависимость не находит реализацию интерфейса AccountRepository, который выглядит как

public interface AccountRepository extends JpaRepository<Account, Long> { 
    Optional<Account> findByUsername(String username); 
} 

Но система должна обеспечивать «правильную реализацию» для JpaRepository. Это та часть, которую я не понимаю.

Любая помощь будет оценена, в частности, указателем, в котором следует изучить глубину этой структуры.

Благодаря

UPDATE Добавления @EnableJpaRepositories ("закладка") класс приложений, решаются вопрос разрешения боба. Но теперь я получаю Вызванный: java.lang.IllegalArgumentException: Не является управляемый тип: класс bookmarks.Account

Мой класс счета юридическое лицо

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 

import com.fasterxml.jackson.annotation.JsonIgnore; 

@Entity 
public class Account { 

    @JsonIgnore 
    public String password; 
    public String username; 
    @OneToMany(mappedBy="Account") 
    private Set<Bookmark> bookmarks = new HashSet<>(); 
    @Id @GeneratedValue 
    private Long id; 

    public Account(String name, String password) { 
     this.username = name; 
     this.password = password; 
    } 

    Account() { } // jpa only 

    // getters and setters 
} 
+0

какие пакеты ваши репозитории в? – farrellmr

+0

Моя структура проекта заключается в следующем: SRC/основной/Java закладки Account.java AccountRepository.java главный Application.java так репозиториев находятся в пакете закладок. – besil

+0

ID скачать источник и работать с ним - https://github.com/spring-guides/tut-bookmarks/blob/master/rest/src/main/java/bookmarks/Application.java - не очень помогает - но вы работаете над учебником – farrellmr

ответ

10

Для JpaRepository быть выбраны рамки, вы должны включите его в свою конфигурацию - добавьте

@EnableJpaRepositories("your.package.with.jpa.repositories") 

в вашем файле @Configuration.


обн

здесь образец конфигурации для JPA хранилищ для работы:

@Bean 
public DataSource dataSource(){ 
    // configure your datasource 
} 

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { 
    LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean(); 
    emfb.setDataSource(dataSource); 
    emfb.setPackagesToScan("your.package.with.model"); 
    emfb.setJpaVendorAdapter(jpaVendorAdapter()); 
    emfb.setJpaPropertyMap(jpaPropertiesMap()); 
    return emfb; 
} 

@Bean 
public JpaVendorAdapter jpaVendorAdapter() { 
    return new HibernateJpaVendorAdapter(); 
} 

@Bean 
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(emf); 
    return transactionManager; 
} 

public Map<String, ?> jpaPropertiesMap() { 
    Properties properties = new Properties(); 
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); // assumption based on your pom-file 
    properties.setProperty("hibernate.hbm2ddl.auto", "..."); // you need to google for appropriate option 
    return properties; 
} 
+0

Спасибо за ответ. Я добавил аннотацию @EnableJpaRepositories («bookmarks») в основной класс «Приложение», но теперь я получив следующую ошибку: java.lang.IllegalArgumentException: Не управляемый тип: class bookmarks.Account. Класс учетной записи - это аннотированный класс @Entity – besil

+0

@besil, так как вы используете 'JpaRepository', ваш' Account' должен быть jpa-объектом, он должен быть аннотирован с помощью '@ Entity' и иметь свойство id, аннотированное с помощью' @ Id'. – Vladimir

+0

Да, это так. Реализация сущности объекта теперь работает, но я не понять, почему класс учетной записи бросает ошибку – besil

2

Конечное (рабочее) конфигурации для решения проблемы заключается в следующем (только после документации http://spring.io/guides/tutorials/bookmarks/).

Раствор добавления

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

в ПОМ.XML, и изменяя

@OneToMany(mappedBy = "account") 
private Set<Bookmark> bookmarks = new HashSet<>(); 

в классе Account (ошибка была: mappedBy = "Счет", заглавная буква ...).

Полный код ниже:

pom.xml

<?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>org.test</groupId> 
    <artifactId>demo</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

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

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.1.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <start-class>demo.MyRestServiceApplication</start-class> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <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>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
     </dependency> 
    </dependencies> 

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

</project> 

счета класса

package bookmarks; 

import java.util.HashSet; 
import java.util.Set; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 

import com.fasterxml.jackson.annotation.JsonIgnore; 

@Entity 
public class Account { 

    @OneToMany(mappedBy = "account") 
    private Set<Bookmark> bookmarks = new HashSet<>(); 

    @Id 
    @GeneratedValue 
    private Long id; 

    public Set<Bookmark> getBookmarks() { 
     return bookmarks; 
    } 

    public Long getId() { 
     return id; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public String getUsername() { 
     return username; 
    } 

    @JsonIgnore 
    public String password; 
    public String username; 

    public Account(String name, String password) { 
     this.username = name; 
     this.password = password; 
    } 

    Account() { // jpa only 
    } 
} 

класс Application

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 
    @Bean 
    CommandLineRunner init(AccountRepository accountRepository, 
      BookmarkRepository bookmarkRepository) { 
     return (evt) -> Arrays.asList(
       "jhoeller,dsyer,pwebb,ogierke,rwinch,mfisher,mpollack,jlong".split(",")) 
       .forEach(
         a -> { 
          Account account = accountRepository.save(new Account(a, 
            "password")); 
          bookmarkRepository.save(new Bookmark(account, 
            "http://bookmark.com/1/" + a, "A description")); 
          bookmarkRepository.save(new Bookmark(account, 
            "http://bookmark.com/2/" + a, "A description")); 
         }); 
    } 

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