Springboot создать бин 2 раза - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть приложение 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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...