Весенняя загрузка: java.awt.HeadlessException

Когда мы пытаемся получить экземпляр буфера обмена.

Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();

Также я попытался запустить приложение загрузки Spring, установив голову.

SpringApplicationBuilder builder = new SpringApplicationBuilder(SpringBootApplication.class,args);
        builder.headless(false).run(args);

мы получаем исключение ниже.

java.awt.HeadlessException
    at sun.awt.HeadlessToolkit.getSystemClipboard(HeadlessToolkit.java:309)
    at com.kpit.ecueditor.core.utils.ClipboardUtility.copyToClipboard(ClipboardUtility.java:57)

Может кто-нибудь подсказать мне, что мне здесь не хватает.

Если я запускаю тот же код буфера обмена в простом приложении Java, он работает, но не в приложении весенней загрузки.

Spring - это веб-фреймворк, и контекст, в котором он будет работать, - это веб-сервер (или консольное приложение, если хотите). Маловероятно, что у вас будет возможность получить доступ к буферу обмена или к awt в целом каким-либо образом.

Horia Coman 23.06.2018 21:34

Spring Core - это структура DI, никак не связанная с веб-приложениями. Вы также можете использовать Spring в Swing, JavaFX или других приложениях с графическим интерфейсом.

dunni 23.06.2018 22:33

Если мы попытаемся получить доступ к jframe и остальной части awt, тогда он будет работать, но с буфером обмена у меня проблема .. Можно ли получить экземпляр системного буфера обмена любым другим способом

mahesh 25.06.2018 11:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
14
3
9 622
3

Ответы 3

У меня было такое же исключение при использовании Spring Boot 2 в приложении Swing.

Вот пример того, что у меня сработало:

В основном классе:

//Main.java
@SpringBootApplication
public class Main implements CommandLineRunner {

    public static void main(String[] args) {
        ApplicationContext contexto = new SpringApplicationBuilder(Main.class)
                .web(WebApplicationType.NONE)
                .headless(false)
                .bannerMode(Banner.Mode.OFF)
                .run(args);
    }

    @Override
    public void run(String... args) throws Exception {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();
            frame.setVisible(true);
        });
    }
}

В тестовом классе вам нужно установить свойство java.awt.headless, чтобы вы не получали исключение java.awt.HeadlessException при тестировании кода:

//MainTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class MainTest {

    @BeforeClass
    public static void setupHeadlessMode() {
        System.setProperty("java.awt.headless", "false");
    }

    @Test
    public void someTest() { }
}

Для тех, у кого есть это исключение, может помочь использование JavaFX этот ответ.

вместо этой строки

 SpringApplication.run(Application.class, args);

использовать

SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);

builder.headless(false);

ConfigurableApplicationContext context = builder.run(args);

Это будет работать

Я попробовал это предложение, но все еще получаю исключение без головы. Ничего из того, что я пробовал, не работает. Графическая среда по-прежнему сообщает, что isHeadless истинно независимо от System.setPropety ("java.awt.headless", "false") или попытки изменить конфигурацию Spring, как показано выше, и служба каждый раз аварийно завершает работу, надежно в "showOpenDialog". Это странно, поскольку один и тот же код отлично работает в службе SPARKJAVA REST (однако, не в структуре для этого приложения).

Morkus 23.10.2019 12:23

@Morkus ты нашел решение своей проблемы?

vesa 08.06.2020 14:11

Вы также можете просто передать параметр JVM при запуске приложения, без изменения кода:

-Djava.awt.headless = ложь

Проверено на springboot 2.2.5.RELEASE

Другие вопросы по теме