没有找到处理程序方法 [英] Did not find handler method
问题描述
我正在尝试调用一个 rest 端点,但是在调用它时获取此信息,导致 UI 中出现 404 错误
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
在同一个包中有 2 个控制器类具有不同的端点
There are 2 controller class in the same package with different endpoint
@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);
}
}
这是 Spring Boot 应用程序类:
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);
}
}
}
这是我的包的结构
当我删除Application.java中的所有注释并只保留@SpringBootApplication时,它给出了以下错误:
When I remove all the annotations in Application.java and just keeping 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
推荐答案
您需要将服务类标记为Available to make beans",以便 Spring 的组件扫描将能够制作 bean并注入值.
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.
这可以通过 @Component
注释来完成.正如@sromit 的回答中提到的,添加 @Service
注释也将起作用,因为它已经继承了 @Component
.@Repository
和 @Controller
也继承了 @Component
注释.
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.
这篇关于没有找到处理程序方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!