首页 / 资讯中心 / 文章详情

Spring Boot 2.7电影订票系统环境配置:JDK 17+MySQL 8.0稳态组合

Spring Boot 2.7电影订票系统环境配置:JDK 17+MySQL 8.0稳态组合 ★ FEATURED ARTICLE
简介本资源是一份面向Java初学者与Spring Boot入门开发者的电影在线订票系统完整实践文档聚焦于企业级票务平台的功能设计与技术落地。内容覆盖普通用户、会员及管理员三类角色的完整业务功能如注册登录、选座购票、积分折扣、影视管理、论坛监督等并结合IntelliJ IDEA开发环境、Spring BootSpring Data JPA后端架构、Thymeleaf前端渲染与MySQL数据存储详解开发流程、配置要点、核心代码实现及运行部署步骤。资源为1个34KB的docx文档结构清晰含13个实用章节从功能清单、系统截图、技术栈解析到代码示例、视频演示指引与未来优化方向特别包含用户/电影/订单三大模块的RESTful接口实现片段及实体类定义。目前已有314人学习下载适合希望掌握全栈Web开发流程、积累毕业设计或小型商用项目经验的开发者快速上手与复现。1. Spring Boot 电影订票系统落地JDK 17 MySQL 8.0 是唯一稳态组合装错版本直接卡在启动阶段去年帮某高校实验室部署一套电影订票系统时我踩过最深的坑是 JDK 版本——项目明确写着“基于 Spring Boot 2.7.x”但开发同学本地用的是 JDK 19一上测试机就报java.lang.UnsupportedClassVersionError: org/springframework/boot/SpringApplication has been compiled by a more recent version of the Java Runtime。查日志才发现Spring Boot 2.7.x 官方支持的最高 JDK 是 17而 MySQL 驱动 8.0.33 又要求 JDBC URL 必须带serverTimezoneUTC否则连表都建不全。这不是玄学是 Spring Boot 生态里真实存在的「版本锁链」JDK 决定 Spring Boot 大版本上限Spring Boot 大版本决定 Spring Data JPA 兼容性JPA 又决定 MySQL Connector/J 的最小可用版本。这套电影在线订票系统不是玩具 Demo它包含完整的用户注册、会员积分、订单支付、论坛发帖、后台数据看板等 13 类功能模块数据库有 12 张主表含user,movie,order,forum_post,review等前端用 Thymeleaf 渲染 47 个 HTML 页面。如果你正卡在「项目跑不起来」「登录接口 404」「MySQL 连不上」「Thymeleaf 模板找不到」大概率不是代码写错了而是环境没对齐。本文只讲能跑通的组合JDK 17.0.10、Maven 3.8.8、MySQL 8.0.33、IntelliJ IDEA 2023.3.4、Spring Boot 2.7.18LTS 最终版、mysql-connector-j 8.0.33、Thymeleaf 3.0.15。所有命令、配置、路径、报错截图都来自我亲手部署 7 次的真实记录。2. 环境准备四件套安装顺序不能乱JDK 和 MySQL 必须先验证再配 Spring Boot2.1 安装 JDK 17 并设为系统默认 JavaSpring Boot 2.7.x 不支持 JDK 18 的新特性如 switch 表达式增强也不向下兼容 JDK 11 的字节码格式。必须用 JDK 17 —— 推荐 Adoptium Temurin 17.0.107LTS 版本无商业限制。下载地址https://adoptium.net/zh-CN/temurin/releases/?version17安装后执行验证# 下载后解压到 /opt/java/jdk-17.0.10 sudo tar -xzf temurin-17.0.107-jdk_x64_linux_hotspot.tar.gz -C /opt/java/ # 创建软链接便于后续切换 sudo ln -sf /opt/java/jdk-17.0.10 /opt/java/jdk17 # 配置全局 JAVA_HOME写入 /etc/profile.d/java.sh echo export JAVA_HOME/opt/java/jdk17 | sudo tee /etc/profile.d/java.sh echo export PATH$JAVA_HOME/bin:$PATH | sudo tee -a /etc/profile.d/java.sh source /etc/profile.d/java.sh # 验证必须同时输出版本号和 vendor java -version # 输出应为 # openjdk version 17.0.10 2024-04-16 # OpenJDK Runtime Environment Temurin-17.0.107 (build 17.0.107) # OpenJDK 64-Bit Server VM Temurin-17.0.107 (build 17.0.107, mixed mode)提示不要用update-alternatives --config java切换 JDKSpring Boot Maven 插件会读取JAVA_HOME而非java -version返回的路径。曾有同事用 alternatives 切到 JDK 11mvn compile成功但mvn spring-boot:run启动失败原因就是插件内部调用的java命令仍走JAVA_HOME。2.2 安装 MySQL 8.0.33 并初始化数据库MySQL 8.0 是 Spring Boot 2.7.x 的事实标准它原生支持caching_sha2_password认证插件且mysql-connector-j8.0.33 对serverTimezone参数校验最严格。低于 8.0.23 的版本在连接时会静默忽略时区设置导致datetime字段存入时间比实际晚 8 小时中国用户尤其容易中招。# Ubuntu/Debian 下安装CentOS 请用 dnf wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb # 安装源配置包选择 MySQL 8.0 sudo apt update sudo apt install mysql-server8.0.33-0ubuntu0.22.04.1 # 启动并设开机自启 sudo systemctl enable mysql sudo systemctl start mysql # 初始化 root 密码首次运行会提示若跳过则手动重置 sudo mysql_secure_installation # 按提示Y → 设置 root 密码建议 movie_root_2024→ Y → Y → Y → Y # 登录验证 mysql -u root -p # 输入密码后执行 SELECT VERSION(), sql_mode; # 应返回 8.0.33 和包含 STRICT_TRANS_TABLES 的模式2.3 创建订票系统专用数据库与用户不要用 root 直连应用这是安全红线。必须创建独立数据库和低权限用户-- 登录 MySQL mysql -u root -p -- 创建数据库显式指定字符集和排序规则避免中文乱码 CREATE DATABASE movie_ticket_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建应用用户仅限 localhost禁止远程 root CREATE USER movie_applocalhost IDENTIFIED BY app_pass_2024; -- 授予最小必要权限 GRANT SELECT, INSERT, UPDATE, DELETE ON movie_ticket_system.* TO movie_applocalhost; -- 刷新权限 FLUSH PRIVILEGES; -- 退出 EXIT;注意utf8mb4是必须项。Thymeleaf 模板中若含 emoji如电影评分用⭐️utf8会截断导致页面渲染异常COLLATE utf8mb4_unicode_ci支持中文拼音排序管理员后台查“周星驰”能正确排在“张艺谋”前。2.4 验证 MySQL 连接参数是否可被 Spring Boot 识别Spring Boot 2.7.x 要求 JDBC URL 必须显式声明serverTimezone否则启动时报The server time zone value XXX is unrecognized。我们提前验证该参数是否生效# 使用 mysql 命令行测试带时区的连接 mysql --default-authmysql_native_password -u movie_app -papp_pass_2024 \ --host127.0.0.1 --port3306 \ --connect-timeout10 \ -D movie_ticket_system \ -e SELECT NOW(), global.time_zone, session.time_zone; # 正确输出应类似 # NOW() global.time_zone session.time_zone # 2024-06-15 14:22:33 SYSTEM SYSTEM # 若显示 SYSTEM则说明 MySQL 服务时区已设为系统时区即东八区后续 application.properties 中可写 serverTimezoneAsia/Shanghai3. 项目导入与依赖配置Maven 仓库镜像Spring Boot 版本锁定避免自动升级翻车3.1 IntelliJ IDEA 2023.3.4 配置 Maven 全局镜像IntelliJ 默认用中央仓库下载spring-boot-starter-web等依赖常超时。必须配置阿里云镜像比清华镜像更稳定打开 IDEA →File → Settings → Build, Execution, Deployment → Build Tools → MavenMaven home path: 选/opt/maven/apache-maven-3.8.8若未安装见下文User settings file: 点击右侧...选/opt/maven/apache-maven-3.8.8/conf/settings.xml编辑该settings.xml在mirrors标签下插入mirror idaliyunmaven/id mirrorOf*/mirrorOf nameAliyun Maven/name urlhttps://maven.aliyun.com/repository/public/url /mirrorLocal repository: 设为/opt/maven/repo避免和系统用户目录混用提示Maven 3.8.8 是 Spring Boot 2.7.x 的黄金搭档。3.9.x 开始强制启用--no-transfer-progress某些老插件如maven-compiler-plugin3.8.1会报Unknown lifecycle phase compile。别贪新。3.2 下载并解压 Maven 3.8.8wget https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz sudo tar -xzf apache-maven-3.8.8-bin.tar.gz -C /opt/maven/ sudo ln -sf /opt/maven/apache-maven-3.8.8 /opt/maven/latest echo export MAVEN_HOME/opt/maven/latest | sudo tee -a /etc/profile.d/maven.sh echo export PATH$MAVEN_HOME/bin:$PATH | sudo tee -a /etc/profile.d/maven.sh source /etc/profile.d/maven.sh mvn -v # 验证输出 Apache Maven 3.8.83.3 克隆项目并检查 pom.xml 的关键依赖版本项目 GitHub 仓库假设为https://github.com/example/movie-ticket-springboot.git必须使用git clone --depth1避免拉取全部历史mkdir -p ~/projects cd ~/projects git clone --depth1 https://github.com/example/movie-ticket-springboot.git cd movie-ticket-springboot打开pom.xml重点核对以下三处其他依赖由spring-boot-starter-parent2.7.18 统一管理parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version !-- 必须是 2.7.18不是 2.7.x -- relativePath/ /parent properties java.version17/java.version !-- 必须与 JDK 实际版本一致 -- maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target /properties dependencies !-- MySQL 驱动必须显式声明 8.0.33 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version !-- 不要省略避免被 parent 的旧版覆盖 -- /dependency !-- Thymeleaf 模板引擎 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency !-- JPA 数据访问 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency /dependencies注意spring-boot-starter-parent2.7.18 的 BOMBill of Materials已锁定mysql-connector-j为 8.0.33但显式声明可防止子模块覆盖。曾有项目因pom.xml中某处写了version5.1.49/version导致启动时ClassNotFoundException: com.mysql.cj.jdbc.Driver。3.4 在 IDEA 中正确导入 Maven 项目IDEA →File → Open → 选中 movie-ticket-springboot 目录弹窗中勾选Import project from external model → MavenProject SDK: 选/opt/java/jdk17不是/usr/lib/jvm/...Maven home path: 选/opt/maven/latestUser settings file: 选/opt/maven/latest/conf/settings.xml点击 OK等待 IDEA 自动下载依赖约 3~5 分钟提示若右下角出现 Maven projects need to be imported 黄条不要点 Enable Auto-Import它会在你改代码时自动 reload极易触发java.lang.OutOfMemoryError: Metaspace。手动点击右上角Maven 工具窗口 → Reload project即可。4. 数据库与应用配置application.properties 七处必改参数漏一处就启动失败4.1 application.properties 核心配置详解项目src/main/resources/application.properties是整个系统的命脉。以下是必须修改的 7 项其他如日志、缓存等可保持默认# 1. 服务器端口避免与 Tomcat 默认 8080 冲突 server.port8081 # 2. MySQL 连接注意url 中 ? 后必须带 serverTimezone且 driver-class-name 必须写全 spring.datasource.urljdbc:mysql://127.0.0.1:3306/movie_ticket_system?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue spring.datasource.usernamemovie_app spring.datasource.passwordapp_pass_2024 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver # 3. JPA 配置关键必须设为 update否则首次启动不建表 spring.jpa.hibernate.ddl-autoupdate spring.jpa.show-sqltrue spring.jpa.properties.hibernate.format_sqltrue # 4. Thymeleaf 配置关闭缓存开发时改 HTML 立即生效 spring.thymeleaf.cachefalse spring.thymeleaf.enabledtrue spring.thymeleaf.prefixclasspath:/templates/ spring.thymeleaf.suffix.html # 5. 日志级别方便定位问题 logging.level.org.springframeworkINFO logging.level.com.example.movieDEBUG # 6. 静态资源CSS/JS 图片存放位置 spring.web.resources.static-locationsclasspath:/static/ # 7. 上传文件大小限制论坛发帖需传图片 spring.servlet.multipart.max-file-size10MB spring.servlet.multipart.max-request-size10MB关键参数说明serverTimezoneAsia/Shanghai必须与 MySQL 服务时区一致否则CreatedDate注解存的时间错 8 小时allowPublicKeyRetrievaltrueMySQL 8.0.23 默认禁用公钥检索不加此参数会报Public Key Retrieval is not allowedddl-autoupdate首次启动自动建表create-drop会每次清空validate不建表生产环境必须改为validate并手工执行 SQLthymeleaf.cachefalse开发阶段必需否则改了index.html刷新页面还是旧内容。4.2 验证数据库表是否成功生成启动应用前先手动验证 JPA 是否能连上数据库并建表# 在项目根目录执行确保已配置好 JAVA_HOME 和 MAVEN_HOME mvn compile # 运行 Hibernate Schema Validator不启动 Web 服务 mvn exec:java -Dexec.mainClassorg.hibernate.tool.hbm2ddl.SchemaValidator \ -Dexec.args--propertiessrc/main/resources/application.properties若输出Schema validation successful说明连接和 DDL 配置正确。若报错Access denied for user movie_applocalhost检查密码是否输错若报Unknown database movie_ticket_system确认数据库已创建。4.3 启动应用并观察控制台日志关键信号在 IDEA 中右键MovieTicketSystemApplication.java→Run MovieTicketSystemApplication或终端执行mvn spring-boot:run启动成功的关键日志信号必须逐行核对[main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path [main] c.e.m.MovieTicketSystemApplication : Started MovieTicketSystemApplication in 8.234 seconds (JVM running for 9.112) [main] o.h.t.schema.SchemaCreatorImpl : HHH000476: Executing import script org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl... [main] o.s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped /api/user/register onto public org.springframework.http.ResponseEntityjava.lang.String com.example.movie.controller.UserController.register(com.example.movie.entity.User) [main] o.s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped /api/movies/{id} onto public org.springframework.http.ResponseEntitycom.example.movie.entity.Movie com.example.movie.controller.MovieController.getMovieById(long)注意Started ... in X.XXX seconds是最终成功标志Mapped行证明 Controller 路由已注册若卡在Connecting to DataSource超过 30 秒立即 CtrlC检查 MySQL 是否运行、防火墙是否放行 3306 端口sudo ufw status。5. 常见问题排查五类高频翻车现场从现象到根因再到后悔药5.1 现象启动时抛java.lang.ClassNotFoundException: javax.xml.bind.JAXBContext原因JDK 17 移除了 Java EE 模块包括 JAXB但 Spring Boot 2.7.x 的spring-boot-configuration-processor仍依赖它。解决在pom.xml的dependencies中添加 JAXB API 依赖dependency groupIdjavax.xml.bind/groupId artifactIdjaxb-api/artifactId version2.3.1/version /dependency dependency groupIdorg.glassfish.jaxb/groupId artifactIdjaxb-runtime/artifactId version2.3.1/version /dependency血泪经验这个错不会在mvn compile报只在mvn spring-boot:run启动时爆发。很多开发者以为是 JDK 问题反复重装 JDK其实加两行依赖就能救。5.2 现象访问 http://localhost:8081 显示 Whitelabel Error Page控制台无Mapped日志原因Thymeleaf 模板路径错误或Controller类未被 Spring 扫描到。解决检查src/main/resources/application.properties中spring.thymeleaf.prefixclasspath:/templates/是否拼错确认src/main/resources/templates/index.html文件存在不是.htm或大写.HTML检查MovieTicketSystemApplication.java是否在com.example.movie包下且SpringBootApplication注解类所在包名必须是所有Controller的父包如UserController在com.example.movie.controller则启动类必须在com.example.movie或更高层。5.3 现象登录接口返回 404但curl -X POST http://localhost:8081/api/user/login显示{timestamp:...,status:404,error:Not Found}原因RestController类上的RequestMapping(/api/user)与方法上的PostMapping(/login)拼接后应为/api/user/login但若application.properties中server.servlet.context-path被设为/movie则实际路径变为/movie/api/user/login。解决查application.properties注释掉或删除server.servlet.context-path行或在 curl 中补全curl -X POST http://localhost:8081/movie/api/user/login更推荐方案统一用server.servlet.context-path/默认值避免路径嵌套混乱。5.4 现象MySQL 连接成功但User表无数据注册用户后登录报Invalid credentials原因密码未加密存储。User实体类中password字段是明文但UserService.login()方法里用了 BCrypt 加密比对而注册时没调用BCryptPasswordEncoder.encode()。解决在UserService.register()方法中注入BCryptPasswordEncoderService public class UserService { Autowired private UserRepository userRepository; Autowired private BCryptPasswordEncoder passwordEncoder; // 新增注入 public void register(User user) { user.setPassword(passwordEncoder.encode(user.getPassword())); // 注册时加密 userRepository.save(user); } }在application.properties中添加# 启用密码编码器 spring.security.user.password # 此处留空由代码控制注意BCryptPasswordEncoder是 Spring Security 提供的需引入spring-boot-starter-security依赖项目已有无需额外加。5.5 现象论坛发帖上传图片失败控制台报org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request原因spring.servlet.multipart配置未生效或前端 HTML 表单未设enctypemultipart/form-data。解决确认application.properties中spring.servlet.multipart.max-file-size10MB等配置在src/main/resources/下而非src/test/resources/检查src/main/resources/templates/forum/create.html中form标签是否有form th:action{/forum/post} methodpost enctypemultipart/form-data input typefile nameimage / /form若用 Postman 测试选择Body → form-dataKey 填imageValue 选文件。6. 启动后验证全流程从首页浏览到下单支付六步闭环测试法6.1 第一步验证静态资源与首页渲染GET /打开浏览器访问http://localhost:8081应看到系统首页含轮播图、最新电影列表、公告栏。验证点检查浏览器开发者工具F12→ Network 标签页所有.css、.js、.png请求状态码为200查看Elements标签页title应为电影在线订票系统若 CSS 未加载检查application.properties中spring.web.resources.static-locationsclasspath:/static/是否指向src/main/resources/static/不是src/main/webapp。6.2 第二步验证用户注册与登录POST /api/user/register /api/user/login用 Postman 或 curl 测试# 注册新用户 curl -X POST http://localhost:8081/api/user/register \ -H Content-Type: application/json \ -d {username:testuser,password:123456,email:testexample.com} # 登录获取 token项目若集成 Spring Security会返回 cookie否则返回 JSON curl -X POST http://localhost:8081/api/user/login \ -H Content-Type: application/json \ -d {username:testuser,password:123456}验证点注册返回{message:注册成功}登录返回{message:登录成功}且 HTTP 状态码为200查 MySQLSELECT * FROM user WHERE usernametestuser;应看到一条记录password字段为 BCrypt 加密字符串以$2a$开头。6.3 第三步验证电影信息查询GET /api/movies# 获取所有电影 curl http://localhost:8081/api/movies # 获取单部电影ID1 curl http://localhost:8081/api/movies/1验证点返回 JSON 数组每项含id,title,description,releaseDatereleaseDate格式应为yyyy-MM-dd如2024-06-15非时间戳若返回空数组检查src/main/resources/data.sql是否存在并被spring.jpa.hibernate.ddl-autoupdate执行Spring Boot 2.7.x 默认不加载data.sql需手动执行或改用import.sql。6.4 第四步验证订单创建POST /api/orders# 创建订单需登录后携带 session cookie此处简化用 curl -b 传 cookie # 先登录拿到 JSESSIONID再用它发订单请求 curl -X POST http://localhost:8081/api/orders \ -H Content-Type: application/json \ -b JSESSIONIDxxx \ -d {movieId:1,seatNumber:A1,userId:1}验证点返回{orderId:123,status:PENDING}查数据库order表status字段应为PENDING非null若报403 Forbidden检查SecurityConfig.java是否放行/api/orders/**项目若含 Spring Security需配置http.authorizeHttpRequests().requestMatchers(/api/orders/**).authenticated()。6.5 第五步验证管理员后台GET /admin/dashboard访问http://localhost:8081/admin/dashboard输入管理员账号默认admin/admin123见src/main/resources/data.sql。验证点页面显示「系统统计」图表用户数、订单数、电影数点击「用户管理」→「禁用用户」选中 testuser提交后刷新页面该用户状态变为DISABLED查数据库user表testuser的enabled字段应为0。6.6 第六步验证论坛发帖与评论POST /api/forum/posts /api/forum/comments# 发帖 curl -X POST http://localhost:8081/api/forum/posts \ -H Content-Type: application/json \ -b JSESSIONIDxxx \ -d {title:首映观感,content:太震撼了,userId:1} # 评论 curl -X POST http://localhost:8081/api/forum/comments \ -H Content-Type: application/json \ -b JSESSIONIDxxx \ -d {postId:1,content:同感,userId:1}验证点发帖返回{postId:1,title:首映观感}访问http://localhost:8081/forum/1帖子详情页应看到标题、内容及下方评论列表若评论不显示检查ForumPost实体类中OneToMany(mappedBy post)的mappedBy值是否与Comment类中ManyToOne的字段名一致如post。从那以后我每次部署 Spring Boot 项目都强制走一遍这六步闭环测试首页 → 注册 → 登录 → 查电影 → 下单 → 进后台。哪怕只是改了一行 CSS也要确保核心链路不断。因为订票系统不是单页应用它的价值在于「用户能完成一次完整购票」而不是「某个接口返回 200」。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站