2015-10-20 7 views
5

Ich habe eine Spring-Boot-Anwendung, und ich möchte eine Abhängigkeit in Feder Boot geschrieben, die einige Controller definiert.Spring Boot und Controller in importierten Modulen

Vielleicht ist es einfach, aber wie kann ich die Hauptanwendung in der Lage, alle diese Controller im importierten Modul zu initialisieren? Wenn ich versuche, auf den Pfad zu diesen Controllern zuzugreifen, erhalte ich einen Fehler für die fehlende Handler-Methode für den angegebenen Pfad. Ich habe versucht, wie folgt:

@SpringBootApplication 
@ComponentScan(basePackages = {"com.main.project", "com.imported.dependency"}) 
public class MyApplication 
    implements CommandLineRunner { 

    public static void main(final String... args) { 
     SpringApplication app = new SpringApplication(MyApplication.class); 
     app.setWebEnvironment(true); 
     app.run(args); 

    } 
} 

das heißt ich mit @ComponentScan versucht, aber nichts passiert.

Ich habe auch versucht geladen werden, wenn die Controller zu sehen:

ApplicationContext ctx = SpringApplication.run(FrontendApplication.class, args); 

System.out.println("Let's inspect the beans provided by Spring Boot:"); 

String[] beanNames = ctx.getBeanDefinitionNames(); 
Arrays.sort(beanNames); 
for (String beanName : beanNames) { 
    System.out.println(beanName); 
} 

Sie nicht sind. Ich habe versucht, @SpringBootApplication zu entfernen und @EnableAutoConfiguration und @ComponentScan zu verwenden, aber das funktioniert nicht.

Vorschläge?

+0

Sie falsch geschrieben "Abhängigkeit" auf ComponentScan. –

+0

Ok, das ist ein Tippfehler in meinem Beispiel. Es ist nicht der echte Paketname. Die eine, die ich benutze funktioniert gut –

+0

Haben Sie versucht, sie im SpringApplication Konstruktor auflisten? z.B. SpringApplication-App = neue SpringApplication (MyApplication.class, MyAnnotatedBean.class); –

Antwort

1

nach der Diskussion über den Haupt-Thread habe ich versucht, ein kleines Projekt, das ist wie Ihres und ich legte es auf Github, ich sehe kein Problem.

Geben Sie ihm einen Blick https://github.com/e-ivaldi/mat_boy_test

Dieses aus dem Protokoll 2015.10.24 17: 31901 --- [main] swsmmaRequestMappingHandlerMapping 02,900 INFO: 22 Zugeordnet "{[/ **]}" auf öffentliche java.lang.String com.somethingelse.controllers.SimpleController.xxx()

0

Vielleicht haben Sie einen Konflikt zwischen:

@SpringBootApplication und @ComponentScan.

Im Frühjahr Boot-Dokumentation wir

Die @SpringBootApplication Anmerkung entspricht der Verwendung von @Configuration, @EnableAutoConfiguration und @ComponentScan mit ihren Standardattributen

Der Link lesen: @SpringBootApplication documentation

Können Sie Ihre @SpringBootApplication entfernen und sie durch @Configuration und @EnableAutoConfiguration ersetzen?

0

Verwenden Sie die Annotation @Configuration und @EnableAutoConfiguration.

+0

Es ist die gleiche Antwort von Kuroro, aber drei Stunden später! –

0

Der @SpringBootApplication scannt automatisch jede Klasse mit einem Unterpaket-Namespace von jedem jar im Klassenpfad. Diese Anmerkung ist alles, was Sie brauchen, wenn Ihr Projekt der empfohlenen Verzeichnisstruktur von Spring folgt. Siehe: Spring Boot's Documentation on Structuring your code.

Versuchen Sie Folgendes:

  1. diese Codezeile entfernen:

    @ComponentScan(basePackages = {"com.main.project", "com.imported.dependency"}) 
    
  2. Verschieben MyApplication so dass es in Ihrem Stammverzeichnis befindet. Das Stammverzeichnis sollte dieser Namenskonvention com.example.project folgen. Der vollständig qualifizierte Pfad für die Hauptklasse Ihrer Spring-Boot-Anwendung wäre also: com.example.project.MyApplication, während Sie example und project durch den Hostnamen und den Projektnamen Ihres Unternehmens ersetzen.

  3. Legen Sie Ihre Controller in ein Teilpaket davon (auch wenn sie in einem separaten Glas verpackt sind).So soll ihr Namensraum so etwas wie diese: com.example.project.controllers.

  4. Vergessen Sie auch nicht die @Controller oder @RestController Anmerkung zu Ihren Controller-Klassen hinzuzufügen.

Hoffe, das hilft!