2015-04-22 21 views
7

Spring Boot uygulamasında bir Hizmet sınıfı için @Autowired ek açıklamasını kullanmaya çalışıyorum ancak No qualifying bean of type istisnasını atmaya devam ediyor. Ancak servis sınıfını fasülye değiştirirsem iyi çalışır. Bu benim kodudur:Spring Boot Annotation @Outdoor of Service başarısız olur

package com.mypkg.domain; 
@Service 
public class GlobalPropertiesLoader { 

    @Autowired 
    private SampleService sampleService;   
} 

package com.mypkg.service; 
@Service 
public class SampleService{ 

} 

Ve bu benim SpringBoot sınıftır: Bu çalıştırmayı denediğinizde

package com.mypkg; 

import java.util.Set; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.config.BeanDefinition; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Import; 

@SpringBootApplication 
@EnableJpaRepositories 
@Import(RepositoryRestMvcConfiguration.class) 
@EnableTransactionManagement 
public class TrackingService { 
    private static final Logger LOGGER = LoggerFactory.getLogger(TrackingService.class); 

    static AnnotationConfigApplicationContext context; 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(TrackingService.class, args); 
     context = new AnnotationConfigApplicationContext(); 
     context.refresh(); 
     context.close(); 

    } 

} 

, aşağıdaki özel durum alıyorum: Ben kaldırdığınızda

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mypkg.service.SampleService] 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)} 

Ama SampleService sınıfından @Service ek açıklaması ve AppConfig sınıfımda aşağıdaki gibi bir fasulye olarak ekleyin, iyi çalışıyor:

@Configuration 
public class AppServiceConfig { 

    public AppServiceConfig() { 
    } 

    @Bean(name="sampleService") 
    public SampleService sampleService(){ 
     return new SampleService(); 
    } 

} 

Sınıflar farklı paketlerde. @ComponentScan kullanmıyorum. Bunun yerine, bunu otomatik olarak yapan @SpringBootApplication kullanıyorum. Ancak, ComponentScan ile de denedim ama bu yardımcı olmadı.

Burada yanlış olan ne yapıyorum?

+0

"Uygulama" sınıfınızı ("ana" yöntemle) gösterebilir misiniz? –

+0

Sorumu ana sınıfın koduyla güncelledim. – drunkenfist

+0

@drunkenfist Neden bağlamı kapatıyorsunuz? Bütün fasulye ritelerini yok edeceğini biliyorsun. – minion

cevap

15

Yay fasulyesi yapmak için iki yol kullanıyorsunuz. Sadece bunlardan birini kullanmalısın. @Configuration

@Bean 
public SampleService sampleService(){ 
    return new SampleService(); 
} 

@Autowired ek not edilmelidir yapılandırma sınıfında POJO

@Service 
public class SampleService 
  • @Bean üzerinde

    1. @Service sınıf türü ile çözülür o zaman @Bean(name="sampleService") gerekli değildir, bu sınıf tipine sahip sadece bir tane fasulyeniz var.

      DÜZENLEME 01

      paket com.example

      @SpringBootApplication 
      public class Application implements CommandLineRunner { 
      
      public static void main(String... args) { 
          SpringApplication.run(Application.class); 
      } 
      
      @Autowired 
      private UserRepository userRepository; 
      
      @Autowired 
      private UserService userService; 
      
      @Override 
      public void run(String... strings) throws Exception { 
          System.out.println("repo " + userRepository); 
          System.out.println("serv " + userService); 
      } 
      } 
      

      paket com.example.config

      @Configuration 
      public class AppConfig { 
      
      @Bean 
      public UserRepository userRepository() { 
          System.out.println("repo from bean"); 
          return new UserRepository(); 
      } 
      
      @Bean 
      public UserService userService() { 
          System.out.println("ser from bean"); 
          return new UserService(); 
      } 
      } 
      

      paket com.example.repository

      @Service 
      public class UserRepository { 
      
      @PostConstruct 
      public void init() { 
          System.out.println("repo from @service"); 
      } 
      } 
      
      sen AppConfig sınıfını yorum yapabilirsiniz ve daha sonra se nasıl UserRepository ve UserService autowired edilir bu kodu kullanarak

      paket com.example.service

      @Service 
      public class UserService { 
      
      @PostConstruct 
      public void init() { 
          System.out.println("service from @service"); 
      } 
      
      } 
      

      . Her bir sınıftaki @Service yorumundan sonra ve Appcomfig uncomment ve sınıfları da otomatik olarak bağlanacaktır.

  • +0

    Sanırım sorumu yanlış anladınız. Ben sadece yöntemlerden birini kullanıyorum. POJO üzerinden "@ Service" ile not eklediğinde başarısız olur. Ama konfigürasyon sınıfımda 'Bean'i kullandığımda işe yarıyor. Hizmetin neden başarısız olduğunu bilmek istiyorum. – drunkenfist

    +0

    Cevabı güncelledim. statik AnnotationConfigApplicationContext içeriği; kullanıldı? spring boot yaşam döngüsünü yönetin, bu yüzden neden context.refresh() kullandığınızı ve context.close() –

    +0

    kullandığınızdan emin değilsiniz. Benim için '@ service' yöntemi çalışmıyor. Sadece bir '@ Bean' olarak ilan edilirse getiriliyor. – drunkenfist