启动WARN:This primary key of “id“ is primitive !不建议如此请使用包装类 in Class原因分析

文章描述了在使用Mybatis-Plus框架时遇到的一个警告,该警告提示主键字段id是原始类型,不推荐使用。解决方案是将主键类型从int改为Integer这样的包装类。这有助于避免数据处理时的潜在问题。

现象

项目启动时出现<This primary key of "id" is primitive !不建议如此请使用包装类 in Class:xxx>异常。

WARN 22232 --- [           main] c.b.m.core.metadata.TableInfoHelper      : This primary key of "id" is primitive !不建议如此请使用包装类 in Class: "com.lizz.po.UserPO"

原因

mybatis-plush框架对数据类型进行判断

 Class<?> keyType = tableInfo.getReflector().getGetterType(property);
            if (keyType.isPrimitive()) {
                logger.warn(String.format("This primary key of \"%s\" is primitive !不建议如此请使用包装类 in Class: \"%s\"", property, tableInfo.getEntityType().getName()));
            }

keyType.isPrimitive(),当对象主键类型是原始类型时,报出错误提示。

解决方案

将对象中的主键改为非原始类型即可。

2025-10-14T17:19:01.894+08:00 INFO 23520 --- [ main] com.example.bspring.BSpringApplication : Starting BSpringApplication using Java 17 with PID 23520 (D:\b-spring\target\classes started by Administrator in D:\b-spring) 2025-10-14T17:19:01.897+08:00 INFO 23520 --- [ main] com.example.bspring.BSpringApplication : No active profile set, falling back to 1 default profile: "default" 2025-10-14T17:19:02.592+08:00 INFO 23520 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8090 (http) 2025-10-14T17:19:02.601+08:00 INFO 23520 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-10-14T17:19:02.601+08:00 INFO 23520 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.46] 2025-10-14T17:19:02.643+08:00 INFO 23520 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-10-14T17:19:02.644+08:00 INFO 23520 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 706 ms _ _ |_ _ _|_. ___ _ | _ | | |\/|_)(_| | |_\ |_)||_|_\ / | 3.5.7 2025-10-14T17:19:02.924+08:00 WARN 23520 --- [ main] c.b.m.core.metadata.TableInfoHelper : This primary key of "id" is primitive !建议如此使用包装 in Class: "com.example.bspring.entity.User" 2025-10-14T17:19:03.311+08:00 INFO 23520 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8090 (http) with context path '/' 2025-10-14T17:19:03.321+08:00 INFO 23520 --- [ main] com.example.bspring.BSpringApplication : Started BSpringApplication in 1.761 seconds (process running for 2.207) 2025-10-14T17:19:18.052+08:00 INFO 23520 --- [nio-8090-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2025-10-14T17:19:18.053+08:00 INFO 23520 --- [nio-8090-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2025-10-14T17:19:18.055+08:00 INFO 23520 --- [nio-8090-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms 2025-10-14T17:19:18.125+08:00 INFO 23520 --- [nio-8090-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2025-10-14T17:19:18.234+08:00 INFO 23520 --- [nio-8090-exec-1] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@76fa9d99 2025-10-14T17:19:18.235+08:00 INFO 23520 --- [nio-8090-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 这个启动日志显示连接成功了吗?
10-15
<think>我们分析提供的日志片段,重点关注与数据库连接相关的部分 日志关键点: 1. 在最后几行有HikariCP(Spring Boot默认使用的数据库连接池)的启动日志: "com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting..." 接着是:"com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@76fa9d99" 然后是:"com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed." 2. 这些日志表明: - Hikari连接池启动(Starting) - 成功添加了一个数据库连接(Added connection,并显示了连接对象) - 最后连接池启动完成(Start completed) 结论:根据日志,数据库连接成功建立。 但是,之前的问题可能是应用程序无法获取数据(可能是数据映射问题),而是连接问题。 详细解释: 1. 连接池启动完成(Start completed)表示连接池已经初始化并且至少成功创建了一个到数据库的连接。 2. 日志中没有出现任何连接失败的异常(如SQLException),因此可以确定连接是成功的。 建议:既然数据库连接已成功,那么之前的问题(查询到数据)应该继续检查数据映射问题(如实体字段与数据库字段的映射)或者查询逻辑问题。 相关日志行: 2025-10-14T17:19:18.125+08:00 INFO 23520 --- [nio-8090-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2025-10-14T17:19:18.234+08:00 INFO 23520 --- [nio-8090-exec-1] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@76fa9d99 2025-10-14T17:19:18.235+08:00 INFO 23520 --- [nio-8090-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 因此,答案是:日志显示数据库连接成功。 </think>### 日志分析:数据库连接状态确认 根据您提供的日志信息,数据库连接**成功建立**。以下是关键日志证据和分析: #### ✅ 连接成功的明确证据: 1. **Hikari连接池启动完成日志**: ``` 2025-10-14T17:19:18.125+08:00 INFO ... HikariDataSource : HikariPool-1 - Starting... 2025-10-14T17:19:18.234+08:00 INFO ... HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@76fa9d99 2025-10-14T17:19:18.235+08:00 INFO ... HikariDataSource : HikariPool-1 - Start completed. ``` - `Added connection` 表示成功创建数据库连接 - `Start completed` 是连接池初始化完成的确认信号 2. **无任何连接错误日志**: - 没有出现`Connection refused`、`Access denied`或`Communications link failure`等错误 - 没有SQLException堆栈信息 3. **应用启动成功**: ``` 2025-10-14T17:19:03.321+08:00 INFO ... Started BSpringApplication in 1.761 seconds ``` 应用能在2秒内启动完成,说明数据库连接没有阻塞启动过程 #### ⚠️ 需要注意的警告信息: ``` 2025-10-14T17:19:02.924+08:00 WARN ... TableInfoHelper : This primary key of "id" is primitive !建议如此使用包装 in Class: "com.example.bspring.entity.User" ``` - **含义**:实体`User`的`id`字段使用了基本型(如`long`/`int`),建议改为包装型(如`Long`/`Integer`) - **影响**:这是连接问题,但可能导致空值处理异常(当id为null时会赋默认值0) ### 连接状态验证建议: 虽然日志显示连接成功,但建议进一步确认数据库操作能力: ```java // 在Controller中添加简易测试接口 @GetMapping("/test-query") public String testQuery() { try { Integer count = jdbcTemplate.queryForObject( "SELECT COUNT(*) FROM user", Integer.class); return "✅ 数据库操作正常! 用户表记录数: " + count; } catch (DataAccessException e) { return "❌ 数据库操作失败: " + e.getMessage(); } } ``` 访问 `http://localhost:8090/test-query` 将得到以下结果: - 返回记录数 → 连接和权限正常 - 返回错误信息 → 表存在或权限问题 > **结论**:根据日志,数据库连接**已成功建立**。如果应用程序仍有数据访问问题,原因可能是: > 1. 实体字段映射错误(如之前的`isvalid`匹配) > 2. SQL查询语句错误 > 3. 表权限问题 > 4. 事务配置问题
E:\ruanjianyingyong\JDK\Windows_jdk_17\rj\jdk-17.0.14\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:E:\ruanjianyingyong\Idea\RJyingyong\Rj\IntelliJ IDEA 2024.1.4\lib\idea_rt.jar=54302:E:\ruanjianyingyong\Idea\RJyingyong\Rj\IntelliJ IDEA 2024.1.4\bin" -Dfile.encoding=UTF-8 -classpath E:\ruanjianyingyong\Idea\JavaWJ\demo3\target\classes;C:\Users\21780\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\3.5.0\spring-boot-starter-jdbc-3.5.0.jar;C:\Users\21780\.m2\repository\org\springframework\boot\spring-boot-starter\3.5.0\spring-boot-starter-3.5.0.jar;C:\Users\21780\.m2\repository\org\springframework\boot\spring-boot\3.5.0\spring-boot-3.5.0.jar;C:\Users\21780\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.5.0\spring-boot-starter-logging-3.5.0.jar;C:\Users\21780\.m2\repository\ch\qos\logback\logback-classic\1.5.18\logback-classic-1.5.18.jar;C:\Users\21780\.m2\repository\ch\qos\logback\logback-core\1.5.18\logback-core-1.5.18.jar;C:\Users\21780\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.24.3\log4j-to-slf4j-2.24.3.jar;C:\Users\21780\.m2\repository\org\apache\logging\log4j\log4j-api\2.24.3\log4j-api-2.24.3.jar;C:\Users\21780\.m2\repository\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;C:\Users\21780\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\21780\.m2\repository\org\yaml\snakeyaml\2.4\snakeyaml-2.4.jar;C:\Users\21780\.m2\repository\com\zaxxer\HikariCP\6.3.0\HikariCP-6.3.0.jar;C:\Users\21780\.m2\repository\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;C:\Users\21780\.m2\repository\org\springframework\spring-jdbc\6.2.7\spring-jdbc-6.2.7.jar;C:\Users\21780\.m2\repository\org\springframework\spring-beans\6.2.7\spring-beans-6.2.7.jar;C:\Users\21780\.m2\repository\org\springframework\spring-tx\6.2.7\spring-tx-6.2.7.jar;C:\Users\21780\.m2\repository\com\mysql\mysql-connector-j\9.2.0\mysql-connector-j-9.2.0.jar;C:\Users\21780\.m2\repository\org\projectlombok\lombok\1.18.38\lombok-1.18.38.jar;C:\Users\21780\.m2\repository\org\springframework\spring-core\6.2.7\spring-core-6.2.7.jar;C:\Users\21780\.m2\repository\org\springframework\spring-jcl\6.2.7\spring-jcl-6.2.7.jar;C:\Users\21780\.m2\repository\com\baomidou\mybatis-plus-spring-boot3-starter\3.5.12\mybatis-plus-spring-boot3-starter-3.5.12.jar;C:\Users\21780\.m2\repository\com\baomidou\mybatis-plus\3.5.12\mybatis-plus-3.5.12.jar;C:\Users\21780\.m2\repository\com\baomidou\mybatis-plus-core\3.5.12\mybatis-plus-core-3.5.12.jar;C:\Users\21780\.m2\repository\com\baomidou\mybatis-plus-annotation\3.5.12\mybatis-plus-annotation-3.5.12.jar;C:\Users\21780\.m2\repository\com\baomidou\mybatis-plus-spring\3.5.12\mybatis-plus-spring-3.5.12.jar;C:\Users\21780\.m2\repository\com\baomidou\mybatis-plus-extension\3.5.12\mybatis-plus-extension-3.5.12.jar;C:\Users\21780\.m2\repository\org\mybatis\mybatis\3.5.19\mybatis-3.5.19.jar;C:\Users\21780\.m2\repository\org\mybatis\mybatis-spring\3.0.4\mybatis-spring-3.0.4.jar;C:\Users\21780\.m2\repository\com\baomidou\mybatis-plus-spring-boot-autoconfigure\3.5.12\mybatis-plus-spring-boot-autoconfigure-3.5.12.jar;C:\Users\21780\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.5.0\spring-boot-autoconfigure-3.5.0.jar;C:\Users\21780\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.5.0\spring-boot-starter-web-3.5.0.jar;C:\Users\21780\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.5.0\spring-boot-starter-json-3.5.0.jar;C:\Users\21780\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.19.0\jackson-databind-2.19.0.jar;C:\Users\21780\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.19.0\jackson-annotations-2.19.0.jar;C:\Users\21780\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.19.0\jackson-core-2.19.0.jar;C:\Users\21780\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.19.0\jackson-datatype-jdk8-2.19.0.jar;C:\Users\21780\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.19.0\jackson-datatype-jsr310-2.19.0.jar;C:\Users\21780\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.19.0\jackson-module-parameter-names-2.19.0.jar;C:\Users\21780\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.5.0\spring-boot-starter-tomcat-3.5.0.jar;C:\Users\21780\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.41\tomcat-embed-core-10.1.41.jar;C:\Users\21780\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.41\tomcat-embed-el-10.1.41.jar;C:\Users\21780\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.41\tomcat-embed-websocket-10.1.41.jar;C:\Users\21780\.m2\repository\org\springframework\spring-web\6.2.7\spring-web-6.2.7.jar;C:\Users\21780\.m2\repository\io\micrometer\micrometer-observation\1.15.0\micrometer-observation-1.15.0.jar;C:\Users\21780\.m2\repository\io\micrometer\micrometer-commons\1.15.0\micrometer-commons-1.15.0.jar;C:\Users\21780\.m2\repository\org\springframework\spring-webmvc\6.2.7\spring-webmvc-6.2.7.jar;C:\Users\21780\.m2\repository\org\springframework\spring-aop\6.2.7\spring-aop-6.2.7.jar;C:\Users\21780\.m2\repository\org\springframework\spring-context\6.2.7\spring-context-6.2.7.jar;C:\Users\21780\.m2\repository\org\springframework\spring-expression\6.2.7\spring-expression-6.2.7.jar com.example.demo.Demo3Application . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.5.0) 2025-05-26T11:38:00.341+08:00 INFO 12848 --- [demo3] [ main] com.example.demo.Demo3Application : Starting Demo3Application using Java 17.0.14 with PID 12848 (E:\ruanjianyingyong\Idea\JavaWJ\demo3\target\classes started by 21780 in E:\ruanjianyingyong\Idea\JavaWJ\demo3) 2025-05-26T11:38:00.345+08:00 INFO 12848 --- [demo3] [ main] com.example.demo.Demo3Application : No active profile set, falling back to 1 default profile: "default" 2025-05-26T11:38:01.061+08:00 INFO 12848 --- [demo3] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2025-05-26T11:38:01.072+08:00 INFO 12848 --- [demo3] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-05-26T11:38:01.073+08:00 INFO 12848 --- [demo3] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.41] 2025-05-26T11:38:01.119+08:00 INFO 12848 --- [demo3] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-05-26T11:38:01.120+08:00 INFO 12848 --- [demo3] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 735 ms Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. Get /192.168.137.1 network interface Get network interface info: name:wlan2 (Microsoft Wi-Fi Direct Virtual Adapter #2) Initialization Sequence datacenterId:10 workerId:28 _ _ |_ _ _|_. ___ _ | _ | | |\/|_)(_| | |_\ |_)||_|_\ / | 3.5.12 This primary key of "id" is primitive !建议如此使用包装 in Class: "com.example.demo.pojo.User" 2025-05-26T11:38:01.764+08:00 INFO 12848 --- [demo3] [ main] m.e.s.MybatisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@55342f40 2025-05-26T11:38:01.832+08:00 WARN 12848 --- [demo3] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop' 2025-05-26T11:38:01.843+08:00 INFO 12848 --- [demo3] [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2025-05-26T11:38:01.854+08:00 ERROR 12848 --- [demo3] [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
05-27
### 解决Spring Boot应用启动失败的问题 当遇到Spring Boot应用启动失败的情况时,可能的原因有两个:一是端口8080被占用;二是Bean定义错误。以下是针对这两种情况的具体解决方案。 #### 端口8080被占用的解决方法 如果端口8080已经被其他进程占用,则可以在`application.properties`或`application.yml`文件中修改`server.port`属性来更换端口。例如,在`application.properties`文件中设置如下内容: ```properties server.port=8081 ``` 或者在`application.yml`文件中设置如下内容: ```yaml server: port: 8082 ``` 通过这种方式可以有效避免因端口冲突而导致的应用无法启动问题[^1]。 另外,也可以通过查找并终止占用该端口的进程来解决问题。例如,在Linux系统下,可以使用以下命令找到占用8080端口的进程,并将其终止: ```bash lsof -i:8080 | grep LISTEN | awk '{print $2}' | xargs kill -9 ``` 此操作能够释放被占用的端口资源,从而允许Spring Boot应用正常绑定到8080端口[^1]。 #### Bean 'userMapper'定义无效的解决方法 对于Bean定义错误导致的启动失败问题,通常是因为某些组件未正确注册为Spring容器中的Bean。在这种情况下,可以通过以下方式排查和修复问题: 1. **确认Mapper接口是否标注了适当注解** 如果`UserMapper`是一个MyBatis Mapper接口,需确保其上已添加`@Mapper`注解或将所在包路径加入`@MapperScan`扫描范围。例如: ```java @Mapper public interface UserMapper { // 方法声明... } ``` 或者在启动中配置扫描路径: ```java @MapperScan("com.example.mapper") @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 2. **验证XML映射文件是否存在以及路径是否正确** 若`UserMapper`依赖于外部XML文件作为SQL语句源码,则应检查对应的`.xml`文件是否存在于classpath下的正确位置(通常是`resources/mapper/`目录),并且命名与接口一致。 3. **检查数据库连接配置是否正确** 数据库连接异常也可能引发此问题。因此要仔细核对`application.properties`或`application.yml`中的数据源参数设定无误。比如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC username: root password: rootpassword driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml ``` 4. **尝试重新构建项目以排除缓存影响** 使用Maven或Gradle工具执行清理后再编译打包动作可能会消除潜在的临时性故障因素。 最后一种替代方案是在启动里显式创建自定义嵌入式Tomcat工厂实例指定新端口号的同时初始化特定Beans集合。例如下面展示了一个例子用于调整默认监听地址至8081端口同时注入额外功能模块对象[^2]: ```java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean public TomcatServletWebServerFactory servletContainer() { return new TomcatServletWebServerFactory(8081); } } ``` 以上措施应当能帮助您成功克服当前面临的困难状况。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lizz666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值