Когда мы пытаемся получить экземпляр буфера обмена.
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 Core - это структура DI, никак не связанная с веб-приложениями. Вы также можете использовать Spring в Swing, JavaFX или других приложениях с графическим интерфейсом.
Если мы попытаемся получить доступ к jframe и остальной части awt, тогда он будет работать, но с буфером обмена у меня проблема .. Можно ли получить экземпляр системного буфера обмена любым другим способом




У меня было такое же исключение при использовании 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 ты нашел решение своей проблемы?
Вы также можете просто передать параметр JVM при запуске приложения, без изменения кода:
-Djava.awt.headless = ложь
Проверено на springboot 2.2.5.RELEASE
Spring - это веб-фреймворк, и контекст, в котором он будет работать, - это веб-сервер (или консольное приложение, если хотите). Маловероятно, что у вас будет возможность получить доступ к буферу обмена или к
awtв целом каким-либо образом.