У меня есть приложение JavaFX со Springboot. Проблема в том, что один компонент создается 2 раза с помощью @PostConstruct и получает исключение о том, что последовательный порт уже используется. Однако, я заметил, что у меня есть и @SpringBootApplication, которые также включают аннотации @ComponentScan и @Configuration. И у меня есть класс SpringConfig в root упаковке.
Main.class
package sample;
@SpringBootApplication
public class AppStart extends Application {
private Stage primaryStage;
@Override
public void start(Stage primaryStage) throws Exception {
this.primaryStage = primaryStage;
Platform.setImplicitExit(false);
Parent root = FXMLLoader.load(getClass().getResource("/primal.fxml"));
primaryStage.setTitle("ИС СиАТВ АО ГНЦ НИИАР");
primaryStage.getIcons().add(new Image("/icon.png"));
primaryStage.setScene(new Scene(root, 1400, 900));
createTray();
primaryStage.show();
primaryStage.setOnCloseRequest(event -> {
primaryStage.hide();
});
}
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
SpringApplicationBuilder builder = new SpringApplicationBuilder(AppStart.class);
builder.headless(false);
ConfigurableApplicationContext context = builder.run(args);
launch(args);
}
SpringConfig
package sample;
@Configuration
@PropertySource({"classpath:com.properties", "classpath:application.properties"})
@ComponentScan
public class SpringConfig {
@Bean
public SerialPort serialPort(@Value("${serialPort.portName}") String portName){
return new SerialPort(portName);
}
@Bean
public AnnotationMBeanExporter annotationMBeanExporter(){
AnnotationMBeanExporter annotationMBeanExporter = new AnnotationMBeanExporter();
annotationMBeanExporter.addExcludedBean("dataSource");
return annotationMBeanExporter;
}
}
ComReader - этот класс создан 2 раза и вызвать исключение с помощью функции openPort ()
package sample.Model
@Component
public class ComReader {
@Autowired
private EventListener eventListener;
@Autowired
public SerialPort serialPort;
@Value("${serialPort.baudRate}")
private int baudRate;
@Value("${serialPort.dataBits}")
private int dataBits;
@Value("${serialPort.stopBits}")
private int stopBits;
@Value("${serialPort.parity}")
private int parity;
@PostConstruct
public void init(){
try {
System.out.println("Opening port: " + serialPort.getPortName());
serialPort.openPort();
serialPort.setParams(baudRate,dataBits,stopBits,parity);
serialPort.addEventListener(eventListener, 1);
} catch (SerialPortException e) {
e.printStackTrace();
}
}
}
Иерархия исходных файлов:
-sample (folder)
-Model (folder)
-ComReader.java
-Controller.java
-Repository (folder)
-CRUD interfaces
-AppStart.java
-SpringConfig.java
В этом случае у меня есть работающая программа, но я только получаю " исключение для используемого порта.
Если я удаляю аннотацию @SpringBootApplication из основного класса, я получаю исключение - Нет определяющего bean-компонента типа 'sample.Repository.CallDetailRecordRepository, по крайней мере, 1 bean-компонент, который квалифицируется как кандидат для автоматической передачи .
Если я удаляю @ComponentScan, я получаю исключение - Нет подходящего компонента типа 'sample.Model.Controller'; в setContextFactory (ctx :: getBean);