2014-04-04 9 views
14

Chciałbym użyć funkcji spring-boot-starter-data-jpa, aby stworzyć aplikację inną niż webowa. W dokumentacji 52,4 mówi:Jak skonfigurować wiosenny rozruch z aplikacją swingową?

Kod aplikacji, które chcesz uruchomić jako logiki biznesowej można zaimplementowany jako CommandLineRunner i spadł w kontekście jako @Bean definicji.

Moja AppPrincipalFrame wygląda następująco:

@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(); 
      } 
     } 
    }); 
} 

I rozruchu klasa aplikacja wygląda następująco:

@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); 
    } 
} 

Ale nie działa. Ktoś ma przykład na ten temat?

Edytowano i dodano wyjątek.

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 

Pozdrawiam.

+0

Co to jest "nie działa"? Czy istnieje wyjątek? Logi? –

+0

@DaveSyer tak, dodano wyjątek podsumowany. – Dapaldo

+0

Wiosna wywołała twój konstruktor i jeśli się nie powiodła. Wygląda na to, że ten konstruktor zostanie wywołany dwa razy (raz na wiosnę, aby utworzyć '@ Component' i raz w swojej własnej metodzie' run() '). Nieco dziwne, więc może nie zamierzałeś jednego z nich? –

Odpowiedz

25

Minęło trochę czasu odkąd opublikowałeś to pytanie, ale mam taki sam problem w starym projekcie, który migruję i wymyśliłem inny sposób, myślę, że jest to bardziej zrozumiałe, aby wszystko działało.

Zamiast używać SpringApplication.run(Application.class, args); można użyć: new SpringApplicationBuilder(Main.class).headless(false).run(args); i nie jest konieczne tworzenie klas aplikacji zabawek z JFrame. Dlatego kod może wyglądać następująco:

@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

Dzięki za odpowiedź @Rumal Wypróbuję twoje rozwiązanie – Dapaldo

+1

+1 dla notatki o '.headless (false)'. Otrzymałem 'java.awt.HeadlessException'. Zajęło mi trochę czasu odkrycie tego jest ze względu na aplikację wiosennego rozruchu. – axiopisty

+0

Nawet ja używam tego samego wyjątku. Zintegrowałem aplikację Spring boot z Swings. Próbowałem wszystkich opcji, ale żaden z nich się nie sprawdził. Dostałeś rozwiązanie. – Renukeswar

1

Aplikacja Swing musi być umieszczona w kolejce zdarzeń Swing. Nie robienie tego jest poważnym błędem.

więc poprawny sposób to zrobić:

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); 
    }); 
} 

Ponadto, możemy po prostu użyć @SpringBootApplication adnotacji.

@SpringBootApplication 
public class SwingApp extends JFrame { 

Zobacz mój samouczek Spring Boot Swing integration dla pełnego przykładu pracy.

Powiązane problemy