如果控制器不在Application.java包中,则会出现404错误。 @ComponentScan无法正常工作

时间:2016-06-30 15:31:44

标签: spring-boot

当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的新手,所以我可能会忘记做一些明显的事情。

感谢。

1 个答案:

答案 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类意味着为其及其所有子包启用了组件扫描,而无需您明确配置它。

相关问题