2014-04-04 3 views
14

के साथ वसंत-बूट को कॉन्फ़िगर कैसे करें मैं गैर-वेब अनुप्रयोग बनाने के लिए वसंत-बूट-स्टार्टर-डेटा-जेपीए सुविधाओं का उपयोग करना चाहता हूं। 52.4 प्रलेखन में कहते हैं:स्विंग एप्लिकेशन

आवेदन कोड है कि आप अपने व्यापार तर्क के रूप में चलाना चाहते हैं एक 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

@ डेवसियर हां, संक्षेप में अपवाद जोड़ा गया। – Dapaldo

+0

वसंत ने आपके कन्स्ट्रक्टर को बुलाया और यदि विफल हुआ। ऐसा लगता है कि कन्स्ट्रक्टर को दो बार बुलाया जा रहा है (एक बार स्प्रिंग द्वारा आपके '@ घटक' बनाने के लिए और एक बार अपनी 'रन()' विधि में)। थोड़ा विचित्र, तो शायद आप उनमें से एक का इरादा नहीं था? –

उत्तर

25

कुछ समय हो गया है क्योंकि आपने सवाल पोस्ट किया है, लेकिन मैं एक पुरानी परियोजना में एक ही समस्या के साथ बाहर निकलता हूं जिसे मैं माइग्रेट कर रहा हूं और एक अलग तरीके से समझ रहा हूं, मुझे लगता है कि चीजों को काम करने के लिए और अधिक स्पष्ट है।

SpringApplication.run(Application.class, args); का उपयोग करने के बजाय आप इसका उपयोग कर सकते हैं: new SpringApplicationBuilder(Main.class).headless(false).run(args); और खिलौना बनाने के लिए जरूरी नहीं है आवेदन कक्षा जेएफआरएएम से फैली हुई है। इसलिए कोड इस तरह दिख सकता है:

@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 के लिए धन्यवाद मैं 'headless (false) 'के बारे में नोट के लिए अपने समाधान – Dapaldo

+1

+1 का प्रयास करूंगा। मुझे 'java.awt.HeadlessException' मिल रहा था। वसंत बूट आवेदन की वजह से यह खोजने में मुझे कुछ समय लगा। – axiopisty

+0

यहां तक ​​कि मैं एक ही अपवाद के साथ चल रहा हूं। मैं स्विंग्स के साथ एकीकृत स्प्रिंग बूट एप्लिकेशन। मैंने सभी विकल्पों को आजमाया लेकिन उनमें से कोई भी काम नहीं कर पाया। क्या आपको इसके लिए समाधान मिला। – Renukeswar

1

स्विंग एप्लिकेशन स्विंग इवेंट कतार पर रखा जाना चाहिए। ऐसा नहीं करना एक गंभीर गलती है।

तो सही तरीका यह करने के लिए:

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 ट्यूटोरियल देखें।

संबंधित मुद्दे