2016-06-30 3 views
0

Ich habe Probleme mit Spring-Boot eine einfache Anwendung einrichten, wenn die Application.java, Controller, Dienste und Repositories in verschiedenen Paketen sind.404 Fehler wenn Controller nicht in Application.java Paket. @ ComponentScan funktioniert nicht

Ich weiß, es ist ein häufiges Problem, und ich habe hier festgestellt, dass es darum geht, die Annotation @ ComponentScan in der Hauptklasse einzurichten.

Trotzdem erhalte ich immer noch einen Fehler 404, wenn ich versuche, auf meinen REST-Dienst zuzugreifen.

Hier ist meine Projektstruktur:

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 

Hier ist mein 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); 
    } 

} 

Und der Anfang meiner 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 ist " rest/", und ich bekomme einen 404 Fehler, wenn ich localhost anrufe: 8080/rest/categories. Ich habe versucht, die Basis-URL zu entfernen und es hat nichts geändert. Es funktioniert, wenn ich den Controller in die Application.java-Klasse setze.

Irgendeine Schätzung, warum es nicht funktioniert? Ich bin neu bei Spring-boot, also könnte da etwas offensichtlich sein, das ich vergessen habe.

Danke.

Antwort

1

Das Problem ist Ihre @ComponentScan Annotation. Sie haben es so konfiguriert, dass es in einem Paket mit dem Namen main.java gesucht wird. In Ihrer Anwendung ist jedoch kein solches Paket vorhanden. Die Pakete, die Sie zu tun haben, sind:

  • application
  • controllers
  • dto
  • entities
  • repositories
  • services
  • utils

Sie könnten alle diese Pakete aufzulisten:

@ComponentScan({"application", "controllers", "dto", "entities", "repositories", "services", "utils"}) 

Dies ist jedoch eher unkonventionell sein würde.

Es ist üblicher, dass all Ihre Pakete eine gemeinsame Wurzel haben. Wenn Sie Ihre Application Klasse in diesem Paket platzieren, dann ist keine explizite @ComponentScan erforderlich.Etwas wie folgt aus:

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 

Ihr Paketnamen wäre jetzt:

  • foo
  • foo.controllers
  • foo.dto
  • foo.entities
  • foo.repositories
  • foo.services
  • foo.utils

Und Ihre Application Klasse im foo Paket sein wird, dass die Komponente Scannen gemeint ist, für sie und alle seine Unterpakete aktiviert, ohne dass Sie explizit konfigurieren zu müssen.

+0

Danke! Klappt wunderbar. Ich hätte es besser wissen müssen, aber ich war mit der Tunnelsicht auf dem @ComponentScan fest, anstatt den Fehler in der Pakethierarchie zu sehen. –

Verwandte Themen