【问题标题】:Tomcat started but the database tables aren't being created and localhost:8080 shows "HTTP Status 404"Tomcat 已启动,但未创建数据库表,并且 localhost:8080 显示“HTTP 状态 404”
【发布时间】:2018-08-26 06:33:52
【问题描述】:

我目前正在使用最新的 Spring Tool Suite(在 jdk 1.8 上运行),并且我已经从以下链接中的教程下载了源代码:accessing-data-mysql

我尝试使用 Tomcat 运行它,它显示 INFO: Server startup in 4581 ms 但是当我访问链接 localhost:8080/demo/all 时,页面显示“HTTP 状态 404”并且控制台没有显示任何其他日志。当我检查我的数据库时,也没有自动创建表“用户”。

我刚刚开始从头开始学习 Spring 设置,我感到很难过...在此先感谢您的帮助,对于如何解决我的问题的任何想法将不胜感激。

谢谢。

【问题讨论】:

    标签: java mysql spring hibernate tomcat


    【解决方案1】:

    404 错误是找不到页面错误,因此您可能正在编写与您在控制器中指定的不同的 url。 由于您尚未设置属性,因此不会自动创建表: spring.jpa.hibernate.ddl-auto=更新

    在应用程序.properties 中编写以下代码:-

    server.port=8095
    spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
    spring.datasource.username=newuser
    spring.datasource.password=newuser
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

    我假设您使用的是 oracle 数据库。

    【讨论】:

    • 您好,除了application.properties,我没有修改代码的任何部分,教程中指出了我一直尝试访问的url。我使用的是 mysql,所以我相应地修改了 datasource.url、用户名、密码和驱动程序类名。我尝试从您的 sn-p 添加 server.port 和 hibernate.ddl-auto 配置。但是,输出还是一样的。
    • 你能告诉我你的整个代码吗?如果你可以在这里粘贴它很好,否则上传你的代码保管箱/onedrive并与我分享链接,我会尝试调试它
    • 谢谢,这里是链接:link 我已经将它作为现有的 Maven 项目导入。
    • 这是 gradle 项目,您已将其导入为 maven ,这就是您收到错误的原因
    • 检查后,该项目允许使用 maven 或 gradle 构建。(在指南中以及此处的 eclipse 设置中特别指出:https://spring.io/guides/gs/sts/
    【解决方案2】:

    由于您使用的是 MySql,我建议您尝试以下 .properties 配置:

    spring.datasource.username=<user_name>
    spring.datasource.password=<password>
    spring.datasource.url=jdbc:mysql://localhost:3306/<db_name>?createDatabaseIfNotExist=true&useSSL=false
    

    我在一些 Spring 应用程序上使用它,它对我来说很好用。这将自动创建数据库并运行 DDL 以创建您的初始模式。请注意,我将它与处理设置和管理所有内容的自定义 DatabaConfiguration 类一起使用。类似于:

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories("<where_repos_are_found>")
    public class DatabaseConfiguration {
    
        private static final String[] PACKAGES_TO_SCAN = { "<packages_locations>" };
    
        private static final String PROPERTY_NAME_DATABASE_PASSWORD = "spring.datasource.password";
        private static final String PROPERTY_NAME_DATABASE_URL = "spring.datasource.url";
        private static final String PROPERTY_NAME_DATABASE_USERNAME = "spring.datasource.username";
        private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    
        private static final String PROPERTY_NAME_HIBERNATE_DATABASE_DRIVER = "hibernate.connection.driver_class";
        private static final String PROPERTY_NAME_HIBERNATE_DDL = "hibernate.hbm2ddl.auto";
        private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
        private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
        private static final String PROPERTY_NAME_HIBERNATE_USE_SQL_COMMENTS = "hibernate.use_sql_comments";
    
        private Environment env;
    
        @Autowired
        public DatabaseConfiguration(Environment env) { this.env = env; }
    
        @Bean
        public DataSource getDatasource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
            dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
            dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
            return dataSource;
        }
    
        private Properties getHibernateProperties() {
            Properties properties = new Properties();
            properties.put(PROPERTY_NAME_HIBERNATE_DATABASE_DRIVER, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DATABASE_DRIVER));
            properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
            properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
            properties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
            properties.put(PROPERTY_NAME_HIBERNATE_USE_SQL_COMMENTS, env.getProperty(PROPERTY_NAME_HIBERNATE_USE_SQL_COMMENTS));
            properties.put(PROPERTY_NAME_HIBERNATE_DDL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DDL));
            return properties;
        }
    
        @Bean(name = "entityManagerFactory")
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
            LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
            entityManagerFactoryBean.setDataSource(getDatasource());
            entityManagerFactoryBean.setPackagesToScan(PACKAGES_TO_SCAN);
            JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
            entityManagerFactoryBean.setJpaProperties(getHibernateProperties());
            return entityManagerFactoryBean;
        }
    
        @Bean
        public JpaTransactionManager transactionManager() {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
            return transactionManager;
        }
    
    }
    

    此外,出于任何目的,我使用 hibernate 自己的属性而不是 Spring 的属性,所以一个例子就是这个:

    hibernate.hbm2ddl.auto=create
    hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    
    hibernate.show_sql=true
    hibernate.format_sql=true
    hibernate.use_sql_comments=true
    hibernate.connection.driver_class=com.mysql.jdbc.Driver
    

    最后关于你得到的 404,我认为你点击的链接可能是错误的。我建议打开 debug 日志属性,以便在应用程序启动后更好地查看您的各种映射。

    你可以通过设置logging.level.&lt;package_name_of_your_app&gt;=debug来做到这一点

    【讨论】:

      【解决方案3】:

      如果您使用 maven 或 gradle 等效命令,请运行 maven 安装,然后重新启动 tomcat。 我有同样的问题。它对我有用。

      希望有用。

      【讨论】:

        【解决方案4】:

        我最终从头开始创建我的项目,而不是导入现有项目。解决有关 Hibernate 不自动创建表的错误的方法是替换 application.properties 中的这一行:

        spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
        

        到这里:

        spring.jpa.database=MYSQL
        

        我遵循了这个链接上的建议:How to let Hibernate create tables in database automatically when used with JPA?

        但是,找不到所提供文档的链接,并且回答问题的人没有在他的帖子中解释。

        感谢所有花时间帮助我的人。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-15
          • 2019-12-16
          • 2014-01-28
          • 1970-01-01
          相关资源
          最近更新 更多