我开始学习Spring Boot,我正在关注youtube上的教程。但是,我的项目发生了一件奇怪的事情。我刚刚创建了一个名为 GreetingController 的Controller。以下是该类的完整代码
@RestController
@EnableAutoConfiguration
public class GreetingController {
private static BigInteger nextId;
private static Map<BigInteger, Greeting> greetingMap;
private static Greeting save(Greeting greeting) {
if (greetingMap == null) {
greetingMap = new HashMap<BigInteger, Greeting>();
nextId = BigInteger.ONE;
}
greeting.setId(nextId);
nextId = nextId.add(BigInteger.ONE);
greetingMap.put(greeting.getId(), greeting);
return greeting;
}
static {
Greeting g1 = new Greeting();
g1.setText("Hello World");
save(g1);
Greeting g2 = new Greeting();
g2.setText("Hola Mundo");
save(g2);
}
@RequestMapping(value = "/api/greetings", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Collection<Greeting>> getGreetings() {
Collection<Greeting> greetings = greetingMap.values();
return new ResponseEntity<Collection<Greeting>>(greetings,
HttpStatus.OK);
}
}
控制器位于以下包装中:
但是,当我使用网址http://localhost:8080/api/greetings
引导应用程序时,我的页面上会出现以下错误:
但是,当我将GreetingController放在 Application 类的相同包中时,如下图所示:
然后获得相同的网址http://localhost:8080/api/greetings
,我得到了正确的回复:
任何人都可以解释我为什么吗?
答案 0 :(得分:3)
将您的com.example
包重命名为org.example
。当您放置@SpringBootApplication
注释时,Spring启动会扫描控制器所有类包的子包。
或者将@ComponentScan("org.example")
放在同一个班级。通过这种方式,您可以告诉spring boot在哪里搜索控制器(以及其他bean)。
答案 1 :(得分:1)
如果您想支持在另一个软件包中安装控制器,则需要将其包含在应用程序的组件扫描中。
在Application.java
中,您可以添加以下内容:
@ComponentScan({com.example, org.example})
默认情况下,Application所在的软件包将包含在ComponentScan中,这就是为什么当控制器与Application在同一个软件包中时它适用于你。
此外,您不需要控制器上的@EnableAutoConfiguration
注释,仅供参考。