2015-10-09 6 views
9

Ich beginne mit dem Lernen Frühling und ich erstelle Basisprojekt, die Datenbank erstellt, Werte einfügen und drucken Sie es im Webbrowser. Mein Problem ist, dass, wenn ich RestController im gleichen Paket wie Hauptklasse habe - es OK, aber ich möchte es auf andere Pakete verteilen und wenn ich ein neues Paket erstellen, verschieben Sie den RestController es funktioniert nicht. Lassen Sie traf erklären:@RestController in anderen Paket funktioniert nicht

Mein Projekt wie folgt aussieht:

  |-Springtestv_01 
      |-src/main/java 
       |--com.person <-- it's a main package 
       |-Main.java 
       |-Person.java 
       |-PersonLineRunner.java 
       |-PersonRepository.java 
       |-PersonController.java 
       |-com.controller <-- second package, I want put here PersonController.java 
      |-src/main/resources 
       |-data.sql 
      pom.xml 

Mein Controller aussieht:

@RestController 
public class PersonController { 

    @Autowired PersonRepository personRepository; 

    @RequestMapping("/persons") 
    Collection<Person> persons(){ 
     return this.personRepository.findAll(); 
    } 
} 

Wenn alles in com.person Paket ist, schreibe ich in Web-Brower http://localhost:8080/persons und es funktioniert richtig .. Aber ich will verschieben PersonController.java zu com.controller Paket, und wenn ich es bewegte, ruft meine Webbrowser mich

Es ist ein unerwarteter Fehler aufgetreten (Typ = Nicht gefunden, Status = 404). Keine Nachricht verfügbar

und ich habe keine Ahnung, was ich tun sollte, um es zu reparieren. Vielleicht sollte ich etwas in meinem pom.xml ändern ??

Mein pom.xml sieht aus wie

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.person</groupId> 
    <artifactId>person</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>SpringTest_v0_1</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.0.BUILD-SNAPSHOT</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>com.h2database</groupId><artifactId>h2</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId> 
       spring-boot-starter-data-elasticsearch 
      </artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

    <repositories> 
     <repository> 
      <id>spring-snapshots</id> 
      <name>Spring Snapshots</name> 
      <url>https://repo.spring.io/snapshot</url> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </repository> 
     <repository> 
      <id>spring-milestones</id> 
      <name>Spring Milestones</name> 
      <url>https://repo.spring.io/milestone</url> 
      <snapshots> 
       <enabled>false</enabled> 
      </snapshots> 
     </repository> 
    </repositories> 
    <pluginRepositories> 
     <pluginRepository> 
      <id>spring-snapshots</id> 
      <name>Spring Snapshots</name> 
      <url>https://repo.spring.io/snapshot</url> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </pluginRepository> 
     <pluginRepository> 
      <id>spring-milestones</id> 
      <name>Spring Milestones</name> 
      <url>https://repo.spring.io/milestone</url> 
      <snapshots> 
       <enabled>false</enabled> 
      </snapshots> 
     </pluginRepository> 
    </pluginRepositories> 

</project> 

Es wird automatisch generiert, schreibe ich nur eine Abhängigkeit

<dependency> 
     <groupId>com.h2database</groupId><artifactId>h2</artifactId> 
    </dependency> 
+0

Fügen Sie bitte spring context.xml hinzu – Natalia

+0

Ich schätze, Sie haben einen Komponentenscan für das Paket 'com.person' definiert, aber nicht für andere Pakete. – hotzst

+0

Wo kann ich einen Komponentenscan für andere Pakete definieren? – czArek

Antwort

26

Verwendung basePackages:

@ComponentScan(basePackages = { "com.person","com.controller"}) 
+1

Wo schreiben Sie es? In meinem 'Main.java'? – czArek

+5

'@SpringBootApplication @ComponentScan ({ "com.person", "com.controller"}) public class Haupt { public static void main (String [] args) { SpringApplication.run (Main.class, args) ; } } ' Ich füge wie U sehen und es funktioniert !! VIELEN DANK ! :) – czArek

+0

Die Variable 'basePackages' wird zu etwas benötigt? – czArek

3

Mit einer @SpringBootApplication Anmerkung zur Verwendung von @Configuration entspricht, @EnableAutoConfiguration und @ComponentScan.

Aus der Dokumentation:

ComponentScan konfiguriert Komponente Scan-Richtlinien für die Verwendung mit @Configuration Klassen. Bietet Unterstützung parallel zu Spring XMLs Element.

Einer von basePackageClasses(), basePackages() oder sein Alias-Wert() kann angegeben werden, um bestimmte zu durchsuchende Pakete zu definieren. Wenn bestimmte Pakete nicht definiert sind, erfolgt das Scannen aus dem Paket der Klasse mit dieser Annotation.

Sie können es entweder wie Sie verschieben oder basePackages in @ComponentScan angeben.

1

Wir @ComponentScan (basePackages = {"include your package name here"}) verwenden.

Auch wenn Sie ein allgemeines Paket Namensformat haben, dann können wir einfach gemeinsamen Teil des Paketnamens mit * wie @ComponentScan(basePackages = { "com.*"}, so dass alle Pakete mit diesem gemeinsamen Paketnamen gescannt werden.

3

Ich hatte das gleiche Problem die Antworten hier für mich funktionierte, aber ich musste eine weitere Feder Annotation hinzufügen und es ist allgemeiner im Fall mit einer Vielzahl von Repositories. Wir haben die folgende Struktur:

|-src/main/java 
    |--com.person 
     |--repositories 
     |--controllers 
     |--... 

Diese dann in -te Haupt

@SpringBootApplication(scanBasePackages = {"com.person"}) 
@EnableMongoRepositories(basePackages = "com.person.repositories") 
public class MainDemoApplication { // 
} 
0

hinzugefügt werden, sollte ich das gleiche Problem hatte, aber plötzlich fest, dass meine Application.java Klasse (die Klasse mit den wichtigsten Verfahren und @SpringBootApplication-Annotation), die sich in einem anderen, aber parallelen Paket mit der @Controller-Klasse befinden.

Die Sache ist, dass Application.java-Klasse in oder über alle anderen Pakete sein sollte, dann brauchen wir keine @ComponentScan und alle Bohnen werden automatisch gescannt. Beispiel: Wenn sich Application.java in com.person und alle Anwendungs-Beans in com.person befinden, funktioniert es ohne @ComponentScan.

Verwandte Themen