2014-04-04 12 views
14

Ich möchte Spring-Boot-Starter-Daten-Jpa Funktionen verwenden, um eine Non-Web-Anwendung zu erstellen. In der 52,4-Dokumentation sagt:So konfigurieren Sie Spring-Boot mit Swing-Anwendung

Anwendungscode, den Sie als Business-Logik ausführen möchten können als CommandLineRunner implementiert werden und fiel in den Kontext als @Bean Definition.

Mein AppPrincipalFrame wie folgt aussieht:

@Component 
public class AppPrincipalFrame extends JFrame implements CommandLineRunner{ 

private JPanel contentPane; 

@Override 
public void run(String... arg0) throws Exception { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       AppPrincipalFrame frame = new AppPrincipalFrame(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

Und Boot-Anwendungsklasse wie folgt aussieht:

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 
    public static void main(String[] args) { 
    ApplicationContext context = SpringApplication.run(Application.class, args); 
    AppPrincipalFrame appFrame = context.getBean(AppPrincipalFrame.class); 
    } 
} 

aber nicht funktioniert. Hat jemand eine Probe dazu?

Bearbeitung und Ausnahme hinzugefügt.

Exception in thread "main" org.springframework.beans.factory.BeanCreationException:  Error creating bean with name 'appPrincipalFrame'. 

Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [es.adama.swing.ui.AppPrincipalFrame]: Constructor threw exception; nested exception is java.awt.HeadlessException 

Grüße.

+0

Was "funktioniert" nicht? Gibt es eine Ausnahme? Protokolle? –

+0

@DaveSyer ja, Zusammenfassung Ausnahme hinzugefügt. – Dapaldo

+0

Spring hat Ihren Konstruktor aufgerufen und ist fehlgeschlagen. Es sieht so aus, als ob dieser Konstruktor zweimal aufgerufen wird (einmal bei Spring, um die '@ Component' zu erstellen und einmal bei seiner eigenen' run() 'Methode). Ein bisschen bizarr, also hast du vielleicht nicht einen von denen gemeint? –

Antwort

25

Es ist eine Weile her, seit Sie die Frage gestellt haben, aber ich lief mit dem gleichen Problem in einem alten Projekt, das ich migriere und anders gedacht, denke ich, dass klarer, um die Dinge funktionieren zu lassen.

Anstelle von SpringApplication.run(Application.class, args); können Sie verwenden: new SpringApplicationBuilder(Main.class).headless(false).run(args); und es ist nicht notwendig, Spielzeug-Klasse von JFrame zu erweitern. Daher könnte der Code wie folgt aussehen:

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 
    public static void main(String[] args) { 
    ConfigurableApplicationContext context = new SpringApplicationBuilder(Application.class).headless(false).run(args); 
    AppPrincipalFrame appFrame = context.getBean(AppPrincipalFrame.class); 
} 
+1

Danke für die Antwort @Rumal Ich werde versuchen, Ihre Lösung – Dapaldo

+1

+1 für den Hinweis über '.headless (false)'. Ich bekam eine 'java.awt.HeadlessException'. Es hat eine Weile gedauert, bis ich festgestellt habe, dass dies an der Anwendung des Spring-Bootes liegt. – axiopisty

+0

Auch ich bin mit der gleichen Ausnahme ausgeführt. Ich integrierte Spring-Boot-Anwendung mit Swings. Ich habe alle möglichen Optionen ausprobiert, aber keiner von ihnen hat funktioniert. Hast du dafür eine Lösung gefunden? – Renukeswar

1

Die Swing-Anwendung muss in der Swing Event Queue platziert werden. Nicht tun, ist ein schwerwiegender Fehler.

So ist der richtige Weg, es zu tun:

public static void main(String[] args) { 

    ConfigurableApplicationContext ctx = new SpringApplicationBuilder(SwingApp.class) 
      .headless(false).run(args); 

    EventQueue.invokeLater(() -> { 
     SwingApp ex = ctx.getBean(SwingApp.class); 
     ex.setVisible(true); 
    }); 
} 

Darüber hinaus können wir nur die @SpringBootApplication Annotation verwenden.

@SpringBootApplication 
public class SwingApp extends JFrame { 

mein Spring Boot Swing integration Tutorial für ein volles Arbeits Beispiel.

Verwandte Themen