2017-09-30 14 views
2

私はSpringを初めて使用しており、簡単な休憩アプリケーションを作成しようとしています。 1つのパッケージにすべてのファイルがあると、アプリケーションはうまくいきました。私は自分のプロジェクト構成を変更したので、私は自分のプロジェクトを構築することができません。私はこのエラーを取得しています:プロジェクトツリーの変更後にSpring UnsatisfiedDependencyExceptionが発生しました

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ファイル:

私の現在のプロジェクトツリーは、ここでは、この

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

のように見えます

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 [or[email protected]16267862] to prepare test instance [[email protected]] 

は私のCustomer.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(); 
    } 
} 

答えて

3

あなたのいずれかのクラスが他上記パッケージにあるように、一つのパッケージをApplicationクラスを上に移動するか、手動でscanBasePackages経由basePackageを指定する必要があります@SpringBootApplicationによって開始されたコンポーネントスキャンの場合はscanBasePackageClassesです。

を参照してください。

1

デフォルトでは、@SpringBootApplicationは、注釈付きクラスのパッケージから「降順」のコンポーネントのみのパッケージをスキャンします。

メインクラスがsocketApp.mainであり、リポジトリがsocketApp.dal.repositoryであるため、あなたのケースでは、それは見つからないでしょう。

移動ApplicationsocketAppをパッケージ化する:

2つのオプションがあります。

package socketApp;  

... 

@SpringBootApplication 
public class Application implements CommandLineRunner { 
... 

または@ComponentScanアノテーションを追加してください。あなたの場合、それは次のようになります:

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

私の意見は、最初のオプションが優れています。

+1

2つ目のアプローチの場合は、@ ComponentetScanを使用しないでください。代わりに、既存の@ComponentSanに委譲する '@ SpringBootApplication'のプロパティを使用する必要があります。 – luk2302

関連する問題