2016-04-09 1 views
0

Я прочитал несколько похожих вопросов и ответов, связанных с autowire и BeanCreationException, и кажется, что основным источником проблемы обычно является аннотация и дерево проекта в ComponentScan.Весенний ботинок, Autowire Mongo repo генерирует BeanCreationException

Но я все еще не понимаю, почему мое приложение выдает это исключение. здесь является 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>com.test.game</groupId> 
    <artifactId>gameP</artifactId> 
    <version>0.1.0</version> 
    <packaging>jar</packaging> 
    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.3.RELEASE</version> 
    </parent> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-all</artifactId> 
      <version>2.0.2-beta</version> 
      <scope>test</scope> 
     </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-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-mongodb</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.0</version> 
     </dependency> 
    </dependencies> 
    <properties> 
     <java.version>1.8</java.version> 
    </properties> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Применение бегуна с SpringBootApplication аннотацию

package core.main.exec; 

@SpringBootApplication 
@Configuration 
@ComponentScan("core.main") 
public class ApplicationRunner implements CommandLineRunner { 
    @Autowired 
    GameEntityRepository repo; 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(ApplicationRunner.class, args); 
    } 

    @Override 
    public void run(String... args) throws Exception { 
     Game newGame = new Game(); 
     newGame.setId(1213123L); 
     newGame.setName("halo 123"); 
     newGame.setDeck("Duck"); 
     newGame.setMedium_url("url"); 
     repo.save(newGame); 
    } 
} 

И хранилище определяется как сильфона

package core.main.controller; 

public interface GameEntityRepository extends MongoRepository { 
} 

И сущность Монго имени Game является таким, как сильфонный

package core.main.mongoentity; 

@Document 
public class Game { 
    @Id 
    private Long id; 
    private String deck; 
    private String name; 
    private String medium_url; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getDeck() { 
     return deck; 
    } 

    public void setDeck(String deck) { 
     this.deck = deck; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getMedium_url() { 
     return medium_url; 
    } 

    public void setMedium_url(String medium_url) { 
     this.medium_url = medium_url; 
    } 
} 

Как только я запустить приложение я получаю BeanCreationException со следующим сообщением об ошибке

Не удалось autowire поле: core.main.controller.GameEntityRepository core.main.exec.ApplicationRunner.repo

ответ

0

Я думаю, что эта ошибка вызвана пакет сканирования

рефакторинг это

@SpringBootApplication 
@Configuration 
@ComponentScan("core.main") 
public class ApplicationRunner implements CommandLineRunner {} 

как этот

@SpringBootApplication 
@EntityScan({"core.main.mongoentity"}) 
@EnableJpaRepositories(basePackages = {"core.main.controller"}) 
public class ApplicationRunner implements CommandLineRunner {} 

, а также не использовать @ComponentScan("core.main") потому что @SpringBootApplication предоставляет атрибуты @EnableAutoConfiguration и @ComponentScan

, а также репозиторий некорректный которых Вы не объявить объект для MongoRepository

реорганизовать ваше хранилище

public interface GameEntityRepository extends MongoRepository {} 

как этот

public interface GameEntityRepository extends MongoRepository<Game,Long>{} 

и добавить эту зависимость в pom.xml

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

Я не уверен, почему вы добавили @EnableJpaRepositories аннотацию. Но просто добавление сканирования объекта даст мне новую ошибку, которая говорит об ошибке создания компонента с именем «embeddedServletContainerCustomizerBeanPostProcessor». – Salman9

+0

эта ошибка tomcat, теперь ваши бобы созданы успешно –

+0

В pom нет никакой зависимости tomcat. может быть, я что-то упустил ?! – Salman9