java - Cómo configurar el arranque de primavera con la aplicación swing
spring-boot (3)
Ha pasado un tiempo desde que publicaste la pregunta, pero me he quedado con el mismo problema en un proyecto antiguo que estoy migrando y he pensado de otra manera, creo que más claro, para que las cosas funcionen.
En lugar de usar SpringApplication.run(Application.class, args);
puede usar: el new SpringApplicationBuilder(Main.class).headless(false).run(args);
y no es necesario hacer que la clase de aplicación de juguete se extienda desde JFrame. Por lo tanto el código podría verse como:
@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);
}
Me gustaría usar las características spring-boot-starter-data-jpa para crear una aplicación no web. En la documentación 52.4 dice:
El código de aplicación que desea ejecutar como su lógica de negocios puede implementarse como CommandLineRunner y colocarse en el contexto como una definición de @Bean.
Mi AppPrincipalFrame se parece a:
@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();
}
}
});
}
Y la clase de aplicación de arranque se ve así:
@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);
}
}
Pero no funciona. ¿Alguien tiene una muestra sobre esto?
Editado y excepción añadida.
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
Saludos.
La aplicación Swing debe colocarse en la cola de eventos Swing. No hacerlo es un grave error.
Así que la forma correcta de hacerlo:
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);
});
}
Además, solo podemos usar la anotación @SpringBootApplication
.
@SpringBootApplication
public class SwingApp extends JFrame {
Vea mi tutorial de integración de Spring Boot Swing para un ejemplo completo de trabajo.
Otra solución simple y elegante es deshabilitar la propiedad sin cabeza como se muestra here. Sin embargo, tendrá que hacerlo, justo antes de crear / mostrar el JFrame.
System.setProperty("java.awt.headless", "false"); //Disables headless
Entonces, lo que funcionó para mí:
SpringApplication.run(MyClass.class, args);
System.setProperty("java.awt.headless", "false");
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame("myframe");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
});
Anotaciones en MyClass.class (no sé si desempeñan algún papel):
@SpringBootApplication
@EnableWebMvc