2017-09-30 56 views
2

我是Spring的新手,我試圖做一個簡單的休息應用程序。當我將所有文件放在一個包中時,應用程序運行良好。由於我改變了我的項目組織,我無法建立我的項目。我收到此錯誤:項目樹發生變化後出現Spring UnsatisfiedDependencyException

2017-09-30 22:32:48.428 WARN 9428 --- [   main] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'application': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'socketApp.dal.repository.CustomerRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    2017-09-30 22:32:48.431 INFO 9428 --- [   main] utoConfigurationReportLoggingInitializer : 

    Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled. 
    2017-09-30 22:32:48.495 ERROR 9428 --- [   main] o.s.b.d.LoggingFailureAnalysisReporter : 

    *************************** 
    APPLICATION FAILED TO START 
    *************************** 

    Description: 

    Field repository in socketApp.main.Application required a bean of type 'socketApp.dal.repository.CustomerRepository' that could not be found. 


    Action: 

    Consider defining a bean of type 'socketApp.dal.repository.CustomerRepository' in your configuration. 

    2017-09-30 22:32:48.496 ERROR 9428 --- [   main] o.s.test.context.TestContextManager  : Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.Se[email protected]] to prepare test instance [[email protected]] 

我現在的項目樹是這個樣子

src 
    main 
    java 
     app 
     dal 
      model 
      -Customer.java 
      repository 
      -CustomerRepository.java 
     main 
      -Aplication.java 
     webServices 
      -GreetingController.java 

這裏是我的Customer.java文件:

package socketApp.dal.model; 

import org.springframework.data.annotation.Id; 


public class Customer { 

    @Id 
    public String id; 

    public String firstName; 
    public String lastName; 

    public Customer() {} 

    public Customer(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    @Override 
    public String toString() { 
     return String.format(
       "Customer[id=%s, firstName='%s', lastName='%s']", 
       id, firstName, lastName); 
    } 

} 

我CustomerRepository.java文件:

package socketApp.dal.repository; 


import java.util.List; 

import org.springframework.data.mongodb.repository.MongoRepository; 
import org.springframework.stereotype.Repository; 
import socketApp.dal.model.Customer; 

@Repository 
public interface CustomerRepository extends MongoRepository<Customer, String> { 

    public Customer findByFirstName(String firstName); 
    public List<Customer> findByLastName(String lastName); 


} 

My Application.ja VA

package socketApp.main; 



import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import socketApp.dal.model.Customer; 
import socketApp.dal.repository.CustomerRepository; 

@SpringBootApplication 

public class Application implements CommandLineRunner{ 

    @Autowired 
    private CustomerRepository repository; 

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

    @Override 
    public void run(String... args) throws Exception { 

     repository.deleteAll(); 

     // save a couple of customers 
     repository.save(new Customer("Alice", "Smith")); 
     repository.save(new Customer("Bob", "Smith")); 

     // fetch all customers 
     System.out.println("Customers found with findAll():"); 
     System.out.println("-------------------------------"); 
     for (Customer customer : repository.findAll()) { 
      System.out.println(customer); 
     } 
     System.out.println(); 

     // fetch an individual customer 
     System.out.println("Customer found with findByFirstName('Alice'):"); 
     System.out.println("--------------------------------"); 
     System.out.println(repository.findByFirstName("Alice")); 

     System.out.println("Customers found with findByLastName('Smith'):"); 
     System.out.println("--------------------------------"); 
     for (Customer customer : repository.findByLastName("Smith")) { 
      System.out.println(customer); 
     } 

    } 
} 

最後我GreetingController.java

package socketApp.webServices; 



import socketApp.dal.repository.CustomerRepository; 
import java.util.List; 
import java.util.concurrent.atomic.AtomicLong; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 
import socketApp.dal.model.Customer; 
import socketApp.dal.model.Greeting; 

@RestController 
public class GreetingController { 

    @Autowired 
    private CustomerRepository repository; 


    @RequestMapping("/") 
    public List<Customer> getAllCustomers(){ 
     // fetch all customers 
    return repository.findAll(); 
    } 
} 

回答

1

默認情況下,@SpringBootApplication將從註釋類的包中掃描組件「僅降序」。

因此,在你的情況下,因爲主類在socketApp.main和存儲庫在socketApp.dal.repository那麼它不會被發現。

你有兩個選擇:

移動Application包裝socketApp

package socketApp;  

... 

@SpringBootApplication 
public class Application implements CommandLineRunner { 
... 

或者添加額外的@ComponentScan註釋。在你的情況下,它會是:

@SpringBootApplication 
@ComponentScan("socketApp") 
public class Application implements CommandLineRunner { 
... 

我認爲第一個選項更好。

+1

在第二種方法的情況下,您不應該使用'@ ComponetScan',而應該使用'@ SpringBootApplication'的屬性來委託已存在的@ComponentSan。 – luk2302

相關問題