Spring Boot CRUD项目时区配置错误引发JDBC及Bean问题求助
解决MySQL时区配置错误及Spring Boot CRUD项目中的其他小问题
嘿,我看你这是遇到了MySQL时区配置导致的连锁问题,先别着急,咱们一步步把这些坑填上:
1. 先搞定核心的时区错误
你看到的"服务器时区值'unknown'无法识别"是MySQL JDBC驱动的典型问题,尤其是用了6.0+版本的驱动时,必须明确指定时区。直接修改application.properties里的数据库URL就行:
spring.datasource.url=jdbc:mysql://localhost:3306/digital?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
serverTimezone=Asia/Shanghai:换成你所在的时区就行,比如UTC也可以,关键是要明确指定useSSL=false:开发环境可以先关了SSL,生产环境按需开启allowPublicKeyRetrieval=true:解决某些情况下的公钥检索报错
另外,驱动类也建议换成新版的:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
你用的mysql-connector-java是6.0.3,已经属于cj系列驱动了,旧的com.mysql.jdbc.Driver早就被废弃啦。
2. 给Controller补上关键注解
你的DigitalController没加@RestController和基础路径注解,Spring根本识别不了这是个REST控制器,请求肯定映射不上:
package com.eg.demo.controller; import com.eg.demo.model.DigitalEmployee; import com.eg.demo.service.DigitalEmployeeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController // 必须加这个,让Spring知道这是REST接口 @RequestMapping("/api") // 加个基础路径,避免和其他接口冲突 public class DigitalController { @Autowired DigitalEmployeeService digitalEmployeeService; // 你的其他接口方法保持不变... }
3. 优化Service里的Optional处理
在DigitalEmployeeServiceImpl的findById方法里,直接.get()会在找不到数据时炸锅,建议改成优雅的空值处理:
public DigitalEmployee findById(Long id) { return digitalEmployeeRepo.findById(id) .orElseThrow(() -> new RuntimeException("DigitalEmployee not found with id: " + id)); }
或者直接返回Optional<DigitalEmployee>,让Controller层去处理空值,这样更符合Spring Data的最佳实践。
4. 清理pom.xml里的重复依赖
你的pom里Swagger依赖重复了好几个,springfox-boot-starter已经包含了所有Swagger相关的东西,直接精简成这样就行:
<dependencies> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <!-- 建议升级到最新稳定版,兼容性更好 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
5. 最后确认数据库存在
别忘了提前在MySQL里创建digital数据库,不然JDBC连接时会找不到库:
CREATE DATABASE digital;
把这些修改都做完,重新启动项目,应该就能解决时区错误和其他连锁问题了。要是还有其他报错,再把日志贴出来就行~
内容的提问来源于stack exchange,提问作者Ashish Shrestha
相关产品推荐
相关产品推荐

