Поддержка нескольких сред в приложении JavaFX + Spring Boot + Hibernate - PullRequest
1 голос
/ 08 января 2020

Я создаю приложение JavaFX в Spring Boot с помощью hibernate. Он подключается к базе данных для отображения некоторых данных, в настоящее время он берет сведения о соединении из файла свойств и загружает компоненты sessionFactory, источника данных и менеджера транзакций, используя чистый Java config. Тем не менее, у меня есть несколько баз данных, расположенных на нескольких удаленных машинах, каждая из которых имеет разные IP и данные пользователя. В идеале я хотел бы отобразить форму входа в систему, которая запрашивает имя пользователя и пароль БД при запуске приложения. Я не хочу читать эти детали из файла. Возможно? Я был бы очень признателен за помощь в решении этой проблемы.

Редактировать: Мне удалось это сделать, в моем контроллере входа в систему я просто реализую ApplicationContextAware, а затем загружаю бины регистра вручную, используя данные из текстовых полей.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Вы можете использовать Spring Boot Функции активного профиля

В зависимости от вашего текущего профиля PROD, DEV, PRE-PROD вы можете активировать определенную конфигурацию с данным файлом application.properties. Здесь вы можете найти полную Как

РЕДАКТИРОВАТЬ 2:

Если вы хотите изменить всю базу конфигурации на ввод пользователя (например, это учетные данные) вы должны динамически изменять свойства, и похоже, что @RefreshScope делает работу.

Плохая новость заключается в том, что эта аннотация появляется только в Spring Cloud

0 голосов
/ 13 января 2020

Это мое решение, единственный недостаток в том, что я не могу войти в систему после неудачной попытки входа в систему. Он работает нормально, но если я сначала использую неверные учетные данные, а затем исправляю их, то выдается исключение, сообщающее, что EntityManagerFactory закрыт. (Я удаляю определения bean-компонентов в моем блоке catch, просто хотел сделать код короче)

@Component
public class LoginController implements Initializable, ApplicationContextAware{

    @FXML
    private AnchorPane login;
    @FXML
    private JFXTextField dbUsernameTextField;
    @FXML
    private JFXPasswordField dbPasswordTextField;
    @FXML
    private JFXTextField boxUsernameTextField;
    @FXML
    private JFXPasswordField boxPasswordTextField;
    @FXML
    private JFXComboBox<ComboItem> environmentComboBox;
    @FXML
    private JFXButton loginButton;
    @Autowired 
    private Environment environment;

    @Autowired
    private OrderService orderService;

    private AnnotationConfigApplicationContext context;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        loginButton.setDisable(true);
        List<ComboItem> envs=new ArrayList<ComboItem>();
        String[]environments=environment.getProperty("environments").split(",");
        for(String s:environments) {
            environmentComboBox.getItems().add(new ComboItem(s.toUpperCase(),s));
        }
        environmentComboBox.setConverter(new StringConverter<ComboItem>() {
            @Override
            public String toString(ComboItem object) {
                return object.getKey();
            }
            @Override
            public ComboItem fromString(String string) {
                return null;
            }
        });
    }

    @FXML
    public void selectEnvironment() {
        if(!environmentComboBox.getSelectionModel().isEmpty())
            loginButton.setDisable(false);
    }

    @FXML
    public void authenticate(ActionEvent actionEvent) {

        String boxUsername=boxUsernameTextField.getText();
        String boxPassword=boxPasswordTextField.getText();
        try {
            context.registerBean("dataSource",DataSource.class,()->dataSource());
            context.registerBean("sessionFactory", LocalSessionFactoryBean.class,()->sessionFactory());     
            context.registerBean("transactionManager",HibernateTransactionManager.class,()->getTransactionManager());

            Order order=orderService.findById("");

            FXMLLoader fxmlLoader=new FXMLLoader(getClass().getResource("/fxml/Main.fxml"));
            fxmlLoader.setControllerFactory(context::getBean);
            Parent rootNode=fxmlLoader.load();
            Stage stage=(Stage) login.getScene().getWindow();
            Scene scene=new Scene(rootNode,400,300);
            stage.setScene(scene);
            stage.setTitle("Login");
            stage.setMaximized(true);
            stage.show();
            stage.setOnCloseRequest(event->JSchConnection.close());
        }catch(Exception e) {
        context.removeBeanDefinition("dataSource");
        context.removeBeanDefinition("sessionFactory");
        context.removeBeanDefinition("transactionManager");

            e.printStackTrace();
        }

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context=(AnnotationConfigApplicationContext) applicationContext;       
    }

    private  Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
        properties.put("hibernate.show_sql", "false");
        properties.put("hibernate.format_sql", "true");
        properties.put("hibernate.hbm2ddl.auto", "none");
        return properties;
    }

    public  DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
        dataSource.setUrl("myurl");
        dataSource.setUsername(dbUsernameTextField.getText());
        dataSource.setPassword(dbPasswordTextField.getText());
        return dataSource;
    }

    public  LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[] { "com.mypackage" });
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    public HibernateTransactionManager getTransactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(context.getBean(SessionFactory.class,"sessionFactory"));
        return transactionManager;
    }

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