2016-03-22 27 views
7

Il seguente codice funziona:Perché Swing pensa che sia headless in Spring Boot, ma non in Spring o in plain Java?

import javax.swing.*; 

public class HeadlessExceptionDemo { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame("HeadlessExceptionDemo"); 
     frame.setSize(800, 600); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 
} 

il seguente codice funziona anche:

import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

import javax.swing.*; 

@Configuration 
public class HeadlessExceptionDemo { 

    @Bean 
    public JFrame frame() { 
     JFrame frame = new JFrame("HeadlessExceptionDemo"); 
     frame.setSize(800, 600); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     return frame; 
    } 

    public static void main(String[] args) { 

     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(HeadlessExceptionDemo.class); 
     JFrame frame = ctx.getBean(JFrame.class); 
     frame.setVisible(true); 

    } 
} 

mentre il seguente codice non lo fa:

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ConfigurableApplicationContext; 
import org.springframework.context.annotation.Bean; 

import javax.swing.*; 

@SpringBootApplication 
public class HeadlessExceptionDemo { 

    @Bean 
    public JFrame frame() { 
     JFrame frame = new JFrame("HeadlessExceptionDemo"); 
     frame.setSize(800, 600); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     return frame; 
    } 

    public static void main(String[] args) { 
     ConfigurableApplicationContext ctx = SpringApplication.run(HeadlessExceptionDemo.class, args); 
     JFrame frame = ctx.getBean(JFrame.class); 
     frame.setVisible(true); 
    } 
} 

Causando eccezione di seguito:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.swing.JFrame]: Factory method 'frame' threw exception; nested exception is java.awt.HeadlessException 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 23 common frames omitted 
Caused by: java.awt.HeadlessException: null 
    at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207) ~[na:1.8.0_45] 
    at java.awt.Window.<init>(Window.java:536) ~[na:1.8.0_45] 
    at java.awt.Frame.<init>(Frame.java:420) ~[na:1.8.0_45] 
    at javax.swing.JFrame.<init>(JFrame.java:233) ~[na:1.8.0_45] 
    at com.inthemoon.snippets.springboot.HeadlessExceptionDemo.frame(HeadlessExceptionDemo.java:15) [classes/:na] 
    at com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b.CGLIB$frame$0(<generated>) ~[classes/:na] 
    at com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b$$FastClassBySpringCGLIB$$b7def9bc.invoke(<generated>) ~[classes/:na] 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:355) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at com.inthemoon.snippets.springboot.HeadlessExceptionDemo$$EnhancerBySpringCGLIB$$3680a05b.frame(<generated>) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_45] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45] 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 24 common frames omitted 

Perché? :)

risposta

5

Primavera Boot imposta java.awt.headless a true di default come si vede nel codice sorgente per SpringApplication.java:

private boolean headless = true; 

... 

private void configureHeadlessProperty() { 
     System.setProperty(SYSTEM_PROPERTY_JAVA_AWT_HEADLESS, System.getProperty(
       SYSTEM_PROPERTY_JAVA_AWT_HEADLESS, Boolean.toString(this.headless))); 
} 

Quanto al perché lo fa, c'è un commento nel codice sorgente del metodo setHeadless su impedendo la visualizzazione di icone:

/** 
    * Sets if the application is headless and should not instantiate AWT. Defaults to 
    * {@code true} to prevent java icons appearing. 
    * @param headless if the application is headless 
    */ 
    public void setHeadless(boolean headless) { 
     this.headless = headless; 
    } 
+0

Come modificare questo? :) – Dims

+1

Aggiungi '-Djava.awt.headless = false' sulla riga di comando o segui i consigli in questa domanda e crea il tuo SpringApplicationBuilder: http://stackoverflow.com/questions/23553755/run-spring-boot-headless –