2014-04-04 15 views
14

Tôi muốn sử dụng các tính năng spring-boot-starter-data-jpa để tạo một ứng dụng phi web. Trong tài liệu 52,4 nói:Cách cấu hình khởi động mùa xuân bằng ứng dụng xoay

mã ứng dụng mà bạn muốn chạy như logic kinh doanh của bạn có thể được thực hiện như một CommandLineRunner và rơi vào bối cảnh như một định nghĩa @Bean .

My AppPrincipalFrame trông giống như:

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

khởi động ứng dụng lớp trông giống như:

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

Nhưng không hoạt động. Bất kỳ ai có một mẫu về điều này?

Chỉnh sửa và ngoại lệ được thêm vào.

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 

Kính trọng.

+0

Điều gì "không hoạt động"? Có ngoại lệ không? Nhật ký? –

+0

@DaveSyer có, tóm tắt ngoại lệ được thêm vào. – Dapaldo

+0

Mùa xuân được gọi là hàm tạo của bạn và nếu không thành công. Có vẻ như hàm tạo đó sẽ được gọi hai lần (một lần bằng Spring để tạo '@ Component' của bạn và một lần trong phương thức' run() 'của riêng nó). Hơi kỳ lạ, vì vậy có lẽ bạn không có ý định một trong số đó? –

Trả lời

25

Đã lâu rồi bạn mới đăng câu hỏi, nhưng tôi đã gặp vấn đề tương tự trong một dự án cũ mà tôi đang di chuyển và tìm ra một cách khác, tôi nghĩ rõ ràng hơn, để làm cho mọi thứ hoạt động.

Thay vì sử dụng SpringApplication.run(Application.class, args); bạn có thể sử dụng: new SpringApplicationBuilder(Main.class).headless(false).run(args); và không cần thiết phải làm cho lớp Ứng dụng đồ chơi mở rộng từ JFrame. Do đó, mã có thể trông giống như:

@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

Cảm ơn bạn đã trả lời @Rumal Tôi sẽ thử giải pháp của bạn – Dapaldo

+1

+1 cho ghi chú về '.headless (false)'. Tôi đã nhận được một 'java.awt.HeadlessException'. Tôi mất một lúc để khám phá điều này là do ứng dụng khởi động mùa xuân. – axiopisty

+0

Thậm chí tôi đang chạy với cùng một ngoại lệ. Tôi tích hợp ứng dụng khởi động mùa xuân với Swings. tôi đã thử hầu hết tất cả các tùy chọn nhưng không ai trong số họ làm việc. Bạn có nhận được giải pháp cho việc này không. – Renukeswar

1

Ứng dụng Swing phải được đặt trên hàng đợi sự kiện Swing. Không làm như vậy là một sai lầm nghiêm trọng.

Vì vậy, cách chính xác để làm điều đó:

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

Bên cạnh đó, chúng tôi chỉ có thể sử dụng @SpringBootApplication chú thích.

@SpringBootApplication 
public class SwingApp extends JFrame { 

Xem hướng dẫn làm việc đầy đủ của tôi Spring Boot Swing integration.

Các vấn đề liên quan