有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaFX+Spring Boot+Hibernate应用程序对多个环境的java支持

我正在用hibernate在Spring Boot中构建一个JavaFX应用程序。它连接到数据库以显示一些数据,目前它从属性文件获取连接细节,并使用纯Java配置加载sessionFactory、datasource和transaction manager bean。然而,我在多台远程机器上有多个数据库,每个数据库都有不同的IP和用户详细信息。理想情况下,我希望显示一个登录表单,在应用程序启动时提示输入db用户名和密码。我不想从文件中读到这些细节。有可能吗?我真的很想在这个问题上得到一些帮助

编辑: 为了实现这一点,在我的登录控制器中,我只需实现ApplicationContextAware,然后使用文本字段中的数据手动加载注册bean


共 (1) 个答案

  1. # 1 楼答案

    这是我的解决方案,唯一的缺点是登录尝试失败后无法登录。它可以正常工作,但如果我先使用不正确的登录凭据,然后使用正确的登录凭据,它会抛出一个异常,表明EntityManagerFactory已关闭。(我确实删除了catch块中的bean定义,只是想缩短代码)

    @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;
        }
    
    }