2014-04-04 61 views
14

配置彈簧引導我想用彈簧引導起動數據JPA功能來創建一個非web aplication。 在52.4文件說:您要爲您的業務邏輯運行如何使用Swing應用程序

應用程序代碼可以 實現爲CommandLineRunner投進的背景下作爲 @Bean定義。

AppPrincipalFrame樣子:

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

而且啓動應用程序類樣子:

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

但不起作用。有人有關於此的樣本?

編輯和異常增加。

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 

問候。

+0

它是什麼,「不工作」?是否有例外?日誌? –

+0

@DaveSyer是的,添加了摘要異常。 – Dapaldo

+0

Spring調用你的構造函數,如果失敗。看起來構造函數將被調用兩次(一次由Spring創建你的'@ Component',一次在它自己的'run()'方法中)。有點怪異,也許你不打算其中之一? –

回答

25

,因爲您發佈的問題,它已經有一段時間,但我在我遷移和想出不同的方式老項目相同的問題冒了出來,我覺得更清晰,使事情的工作。

而不是使用SpringApplication.run(Application.class, args);您可以使用:new SpringApplicationBuilder(Main.class).headless(false).run(args);,並且不需要使玩具應用程序類從JFrame擴展。因此代碼可能如下所示:

@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

感謝您的回覆@Rumal我會嘗試您的解決方案 – Dapaldo

+1

+1關於'.headless(false)'的註釋。我得到一個'java.awt.HeadlessException'。我花了一段時間才發現這是因爲Spring引導應用程序。 – axiopisty

+0

即使我正在運行相同的異常。我集成了Swings的Spring引導應用程序。我嘗試了所有的選項,但都沒有解決。你有沒有解決這個問題。 – Renukeswar

1

Swing應用程序必須放置在Swing事件隊列中。 不這樣做是一個嚴重的錯誤。

所以正確的方法來做到這一點:

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

另外,我們可以只使用@SpringBootApplication註解。

@SpringBootApplication 
public class SwingApp extends JFrame { 

請參閱我的Spring Boot Swing integration教程以獲取完整的工作示例。