3

I am trying to invoke a rest endpoint, but getting this info when I call it, resulting in a 404 error in UI

2016-08-07 13:43:42.611 DEBUG 27834 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /api/v1/operations
2016-08-07 13:43:42.614 DEBUG 27834 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/api/v1/operations]
2016-08-07 13:43:42.615 DEBUG 27834 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Matching patterns for request [/api/v1/operations] are [/**]
2016-08-07 13:43:42.616 DEBUG 27834 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : URI Template variables for request [/api/v1/operations] are {}
2016-08-07 13:43:42.617 DEBUG 27834 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapping [/api/v1/operations] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@39ead1b7]]] and 1 interceptor

There are 2 controller classes in the same package with different endpoints

@RestController
public class OperationRetrievalController {
    
    @Autowired
    OperationRetrievalManager operationRetrievalManager;
    
    private static Logger logger = Logger.getLogger(OperationRetrievalController.class);
    
    @RequestMapping("/api/v1/operations")
    public ResponseEntity<List<OperationView>> requestUserOperations() {
        String ssoId = "xxxxxx";
        logger.info("Inside request operationRetrivel Manager +++++++++>>>>>>>>");
        return new ResponseEntity<List<OperationView>>(operationRetrievalManager.retrieveOperations(ssoId), HttpStatus.OK);
    }
    
    
}

I have another class in the same package :

@RestController
public class ComponentRetrievalController {
    
    @Autowired
    ComponentRetrievalManager componentRetrievalManager;
    
    @RequestMapping(value = "api/v1/component/{sso_id}" , method=RequestMethod.GET)
    public ResponseEntity<List<Component>> requestUserComponent(@PathVariable("sso_id") String ssoId) {
        
        return new ResponseEntity<List<Component>>(componentRetrievalManager.retrieveComponents(ssoId), HttpStatus.OK);
    }
}

Here is the Spring Boot app class:

@SpringBootApplication
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages="com.ge.power.bis.repositories")
@ComponentScan(basePackages="com.ge.power.bis.managers")
public class Application {
    
    private static Logger logger = Logger.getLogger(Application.class);


    public static void main(String[] args) {
        
        SpringApplication springApplication = new SpringApplication(Application.class);

        ApplicationContext ctx = springApplication.run(args);

        logger.info("Let's inspect the beans provided by Spring Boot:");
        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames)
        {
            logger.info(beanName);
        }       
    }
}

Here is the structure of my package Package structure

When I remove all the annotations in Application.java and just keep the @SpringBootApplication, It gives the following error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'componentRetrievalController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.ge.power.bis.managers.ComponentRetrievalManager com.ge.power.bis.controllers.ComponentRetrievalController.componentRetrievalManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.ge.power.bis.managers.ComponentRetrievalManager] 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)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapable
Dmitriy Popov
  • 2,150
  • 3
  • 25
  • 34
sromit
  • 900
  • 3
  • 16
  • 43
  • what is the url that you have tried to invoke – kuhajeyan Aug 07 '16 at 19:02
  • http://localhost:8080/api/v1/operations while running as spring boot app in local – sromit Aug 07 '16 at 19:05
  • In which package is `ComponentRetrievalController` defined? It should be in `com.ge.power.bis.managers` or one of its subpackages. – Mubin Aug 07 '16 at 19:27
  • I have changed the annotation as @ComponentScan(basePackages="com.ge.power.bis.* ") but getting this error :ans.factory.BeanCreationException: Error creating bean with name 'componentRetrievalController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.ge.power.bis.managers.ComponentRetrievalManager com.ge.power.bis.controllers.ComponentRetrievalController.componentRetrievalManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of typ – sromit Aug 07 '16 at 19:45

2 Answers2

0

@Service was missing on one of the Impl class

sromit
  • 900
  • 3
  • 16
  • 43
0

You need to mark the service class as "Available to make beans" so the Spring's component-scan will be able to make bean and inject values.

This can be done by @Component annotation. As mentioned in the answer by @sromit, adding @Service annotation will also work, as it already inherits the @Component. @Repository and @Controller also inherit the @Component annotation.