2017-01-15 31 views
7

Pojawia się błąd podczas uruchamiania głównej klasy.Rozważ zdefiniowanie komponentu bean typu "service" w swojej konfiguracji [Spring boot]

błędu:

Action: 
Consider defining a bean of type 'seconds47.service.TopicService' in your configuration. 

Description: 
Field topicService in seconds47.restAPI.topics required a bean of type 'seconds47.service.TopicService' that could not be found 

interfejs TopicService:

public interface TopicService { 

    TopicBean findById(long id); 

    TopicBean findByName(String name); 

    void saveTopic(TopicBean topicBean); 

    void updateTopic(TopicBean topicBean); 

    void deleteTopicById(long id); 

    List<TopicBean> findAllTopics(); 

    void deleteAllTopics(); 

    public boolean isTopicExist(TopicBean topicBean); 
} 

kontrolera:

@RestController 
public class topics { 

    @Autowired 
    private TopicService topicService; 

    @RequestMapping(path = "/new_topic2", method = RequestMethod.GET) 
    public void new_topic() throws Exception { 
     System.out.println("new topic JAVA2"); 
    } 
} 

klasa realizacji:

public class TopicServiceImplementation implements TopicService { 

    @Autowired 
    private TopicService topicService; 

    @Autowired 
    private TopicRepository topicRepository; 

    @Override 
    public TopicBean findById(long id) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public TopicBean findByName(String name) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public void saveTopic(TopicBean topicBean) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public void updateTopic(TopicBean topicBean) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public void deleteTopicById(long id) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public List<TopicBean> findAllTopics() { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public void deleteAllTopics() { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public boolean isTopicExist(TopicBean topicBean) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 
} 

Pozostałe klasy są również zdefiniowane. Nie wiem, dlaczego rzuca się mimo deklarowania componentScan w klasie głównej.

główne klasy:

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class }) 
@ComponentScan(basePackages = {"seconds47"}) 
@EnableJpaRepositories("seconds47.repository") 
public class Application { 

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

mam pakiety tak:

seconds47 
seconds47.beans 
seconds47.config 
seconds47.repository 
seconds47.restAPI 
seconds47.service 
+1

Czy klasę 'TopicServiceImplementation' mieć adnotację' @ Component'? Jeśli nie, musisz dodać ją do klasy, aby Spring mógł ją rozpoznać jako fasolę. – dunni

+1

@dunni Podczas wiosennego rozruchu adnotacja '@ Component' nie jest skanowana automatycznie przez springboot w przeciwieństwie do springmvc – kittu

+0

Jeśli nie dodasz adnotacji do klasy, nie zostanie ona zeskanowana, ponieważ nie została ona oznaczona jako fasola. Jeśli mi nie wierzysz, przeczytaj dokumentację. – dunni

Odpowiedz

10

Klasa musi mieć adnotację @Component lub jej pochodną (jak @Service, @Repository itd.) Rozpoznawaną jako komponent Sprężyna źródłowa przez skanowanie składnika. Więc jeśli dodasz klasę @Component, powinno to rozwiązać twój problem.

+0

Otrzymuję ten błąd, nawet jeśli opisałem tę klasę za pomocą @Component –

1

Próbujesz wstrzyknąć fasoli w sobie. To oczywiście nie zadziała.

TopicServiceImplementation implementuje TopicService. Ta klasa próbuje zautomatyzować (przez pole!) "TopicService". Więc zasadniczo pytasz kontekst, w jaki można wstrzyknąć sobie.

Wygląda na to, że edytowałeś treść komunikatu o błędzie: Field topicService in seconds47.restAPI.topics nie jest klasą. Zachowaj ostrożność, jeśli chcesz ukryć poufne informacje, ponieważ znacznie trudniej jest Ci pomóc.

Wracając do faktycznego problemu, wygląda na to, że wstrzyknięcie TopicService samo w sobie jest usterką po twojej stronie.

+0

Nic nie zrozumiałem, gdy powiedziałeś "Wszczepiam sobie fasolę" ?? Wprowadzam "TopicService", który jest interfejsem do klasy kontrolera 'Tematy' – kittu

+0

Nie edytowałem komunikatu o błędzie. Właśnie edytowałem tytuł pytania, który opublikowałem. – kittu

+0

Nadal istnieje problem. Usunąłem '@Autowired private TopicService topicService;' z klasy implementacji – kittu

3

Od TopicService należy do klasy Service, należy ją opatrzyć adnotacją pod numerem @Service, aby Spring automatycznie wykonał dla Ciebie tę fasolę. Podobnie jak:

@Service 
public class TopicServiceImplementation implements TopicService { 
    ... 
} 

To rozwiąże twój problem.

-1

Musisz zaktualizować swój

scanBasePackages = { "com.exm.java" } 

dodać ścieżkę do Państwa dyspozycji (po opisywanie go @service)