spring cloud 扫不到自定义controller

在 springboot 官网照着给的介绍写了个 springboot 程序

pom.xml

1
2
3
4
5
6
7
8
9
10
11
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

java 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package hello;

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@Controller
@EnableAutoConfiguration
public class Application{

@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!";
}

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

然后自己写了个 Controller

1
2
3
4
5
6
7
8
9
@Controller
public class MyController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
System.out.println("hello");
return "hello";
}
}

但是无论如何也无法扫描到自己定义的 Controller

访问之后,网页报错:

Whitelabel Error Page

报错的原因是找不到对应的映射路径,即 Controller 没有被扫描到 ,。

郁闷至极,到晚上搜的结果说的是 LoginController 方的位置不对,应该让启动类和 Controller 的包在同一级目录下,然而对我却没有效果。

官方建议 application.java 放的位置:

最后尝试了下修改下 Application 上的注解,我本来复制官方的代码用的是 @Controller 和 @EnableAutoConfiguration,试着换成了 @**SpringBootApplication 注解**,出乎意外的可以扫描到 Controller

又查了下官方的文档终于找到原因了,原因是:

如果使用 @Controller 和 @EnableAutoConfiguration 注解还应该再加上一个注解:@ComponentScan 就可以了。@Controller 和 @EnableAutoConfiguration 没有扫描注解的功能,而 @ComponentScan 是

springboot 专门用来扫描 @Component, @Service, @Repository, @Controller 等注解的注解

总结:

使用 springboot 启动类配置扫描的两种注解配置方式:

1、@Controller

@EnableAutoConfiguration

@ComponentScan

2、@SpringBootApplication

@SpringBootApplication 注解等价于 @Configuration, @EnableAutoConfiguration and @ComponentScan

另外application.java(启动类)也应该按照官方的建议放在root目录下,这样才能扫描到Service和dao,不然还会引起,扫描不到注解的问题。
**--- 更新日期:2018-10-14 ---**
最近用了最新的springboot 2.0.5.RELEASE 版本 多了一种新的扫描注解,新版的springboot application可以放在任意位置,只要加上

@ComponentScan(basePackages = {“com.oskyhang”, “com.frames”})

注解就可以,注解指定扫描的包,就可以扫描到,更灵活方便。

多谢支持