当Application.java,控制器,服务和存储库位于不同的包中时,我遇到了spring-boot设置简单应用程序的问题。
我知道这是一个常见的问题,我在这里发现,这是在主类中设置@ComponentScan注释的问题。
然而,尽管如此,我在尝试访问我的REST服务时仍然遇到404错误。
这是我的项目结构:
main
├── java
│ ├── application
│ │ └── Application.java
│ ├── controllers
│ │ └── CategoryController.java
│ ├── dto
│ │ └── ReturnMessage.java
│ ├── entities
│ │ ├── Category.java
│ │ ├── Post.java
│ │ └── User.java
│ ├── repositories
│ │ └── CategoryRepository.java
│ ├── services
│ │ ├── CategoryService.java
│ │ └── CategoryServiceImpl.java
│ └── utils
│ └── Constants.java
这是我的Application.java:
package application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@EnableJpaRepositories
@SpringBootApplication
@Configuration
@ComponentScan("main.java")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
我的CategoryController.java的开头:
@RestController
public class CategoryController {
@Autowired
CategoryService categoryService;
/**
* Retourne la liste des catégories
*/
@RequestMapping(value = Constants.REST_BASE_URL + "/categories", method = RequestMethod.GET)
public List<Category> readAll() {
return categoryService.readAll();
}
Constants.REST_BASE_URL是“rest /”,当我调用localhost:8080 / rest / categories时出现404错误。我尝试删除基本URL,但它没有改变任何内容。如果我将控制器放在Application.java类中,它就可以工作。
为什么它不起作用的任何猜测?我是Spring-boot的新手,所以我可能会忘记做一些明显的事情。
感谢。
答案 0 :(得分:1)
问题在于@ComponentScan
注释。您已将其配置为查找名为main.java
的程序包,但您的应用程序中没有此类程序包。你拥有的包是:
application
controllers
dto
entities
repositories
services
utils
您可以列出所有这些包:
@ComponentScan({"application", "controllers", "dto", "entities", "repositories", "services", "utils"})
然而,这将是非常规的。
对于所有程序包来说,拥有共同的根目录更为传统。如果您将Application
课程放在此课程包中,则根本不需要明确@ComponentScan
。像这样:
main
├── java
| | foo
│ │ ├── Application.java
| │ ├── controllers
| │ │ └── CategoryController.java
| │ ├── dto
| │ │ └── ReturnMessage.java
| │ ├── entities
│ │ ├── Category.java
│ │ ├── Post.java
│ │ ├── User.java
| │ ├── repositories
| │ │ └── CategoryRepository.java
| │ ├── services
| │ │ ├── CategoryService.java
| │ │ └── CategoryServiceImpl.java
| │ └── utils
| │ └── Constants.java
您的包裹名称现在为:
foo
foo.controllers
foo.dto
foo.entities
foo.repositories
foo.services
foo.utils
Application
包中的foo
类意味着为其及其所有子包启用了组件扫描,而无需您明确配置它。