Springboot整合Swagger3.0 冲突报错+完整demo

本文介绍了Springboot 2.6.2版本整合Swagger3.0时遇到的两个错误及解决方案。错误一涉及到Springboot 2.6.0中路径匹配策略的改变,解决方法是通过yaml配置恢复到AntPathMatcher。错误二在于API文档未显示,解决办法包括检查启动类位置、配置类扫描路径等。将启动类移至根目录后,Swagger成功显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Springboot整合Swagger3.0 冲突报错+完整demo

修正后的完整demo(springboot2.6.2+Swagger3.0)可以参考 完整springboot 2.6.2 + swagger 3.0 demo

  • 错误一

切记整合Swagger需要关注Springboot版本情况,我的初始版本是2.6.2,整合后抛出 Failed to start bean ‘documentationPluginsBootstrapper’; 的错误

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-01-13 14:24:57.177 ERROR 15040 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.14.jar:5.3.14]
	at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.14.jar:5.3.14]
	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.14.jar:5.3.14]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_191]
	at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.14.jar:5.3.14]
	at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.14.jar:5.3.14]
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.14.jar:5.3.14]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.14.jar:5.3.14]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.2.jar:2.6.2]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) [spring-boot-2.6.2.jar:2.6.2]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) [spring-boot
<think>好的,我需要帮助用户解决SpringBoot集成Swagger时出现的java.sql.SQLSyntaxErrorException,具体错误是Unknown column &#39;i_id&#39; in &#39;where clause&#39;。首先,我应该理解这个错误的根本原因。SQLSyntaxErrorException通常表示SQL语句中存在语法错误或引用了不存在的列或表。 用户提到的错误信息指出未知的列&#39;i_id&#39;,这说明在生成的SQL查询中,某个地方引用了这个不存在的列。可能的原因有几个:首先,实体类中的字段名与数据库表的列名不一致。例如,实体类中可能有一个名为iId的字段,但数据库表中对应的列名可能不同,比如i_id或者其他的命名。如果使用了JPA或MyBatis等ORM框架,而框架的命名策略没有正确转换,就可能导致列名不匹配。 其次,可能是数据库迁移脚本的问题。例如,使用Flyway或Liquibase时,如果迁移脚本中没有正确添加i_id列,或者列名拼写错误,就会导致表结构中缺少该列,进而引发错误。这时候需要检查数据库的DDL语句,确认i_id列是否存在。 另外,Swagger本身不会直接生成SQL查询,所以这个问题更可能与应用程序中集成的其他组件有关,比如Spring Data JPA或者MyBatis在生成查询时引用了该列。可能是在Swagger的配置或某些API接口的定义中,间接触发了ORM框架生成包含i_id的查询语句。 接下来,我需要考虑解决方案。首先,检查实体类中的字段与数据库表的列名是否匹配。如果使用JPA,默认的命名策略会将驼峰命名的字段转换为下划线分隔的列名,比如iId会变成i_id。但如果数据库中的列名是其他形式,比如iid或者id,就会导致不匹配。这时候可以在实体类的字段上使用@Column(name = "i_id")来明确指定列名。 然后,检查数据库表结构,确认是否存在i_id列。可以通过数据库客户端工具直接查看表结构,或者运行SHOW CREATE TABLE命令。如果缺少该列,需要更新数据库迁移脚本,添加相应的列,并确保应用重启后迁移脚本正确执行。 此外,还需要检查应用程序中是否有自定义的查询语句,比如JPQL或原生SQL,是否错误地引用了i_id列。如果有,需要修正查询语句中的列名,确保与数据库中的列名一致。 可能还需要考虑缓存的问题。有时候,即使数据库表结构已经更新,Hibernate的一级或二级缓存可能仍然持有旧的元数据,导致生成的SQL不正确。可以尝试清除缓存或重启应用来解决。 最后,如果用户在使用Swagger时触发了某些自动生成的API,比如通过Spring Data REST,可能需要检查这些自动生成的端点是否正确地映射了实体类的字段,避免生成错误的查询条件。 总结来说,解决步骤应该是:1. 检查实体类字段与数据库列名的映射;2. 确认数据库中存在i_id列;3. 检查并修正自定义查询;4. 处理可能的缓存问题;5. 验证Swagger配置和生成的API是否正确。</think>关于SpringBoot集成Swagger时出现`java.sql.SQLSyntaxErrorException: Unknown column &#39;i_id&#39; in &#39;where clause&#39;`的解决方案如下: --- ### 问题根源分析 1. **字段映射不一致** 实体类(如JPA Entity)中的字段名`iId`可能未正确映射到数据库表的`i_id`列,或数据库实际缺失该列[^1]。 2. **数据库表结构未更新** 如果使用Flyway/Liquibase等工具,迁移脚本可能未包含`i_id`列的创建语句。 3. **ORM框架生成错误SQL** Hibernate或MyBatis可能因命名策略配置错误,导致生成包含`i_id`的无效SQL。 --- ### 逐步解决方案 #### 步骤1:检查实体类与数据库映射 - **JPA实体类示例**: ```java @Entity @Table(name = "your_table") public class YourEntity { // 显式指定列名 @Column(name = "i_id") // 确保与数据库列名一致 private Long iId; } ``` 若数据库列名为`i_id`,需添加`@Column(name = "i_id")`注解。 #### 步骤2:验证数据库表结构 - 执行SQL命令确认列是否存在: ```sql SHOW CREATE TABLE your_table; ``` 若缺少`i_id`列,需通过迁移脚本添加: ```sql ALTER TABLE your_table ADD COLUMN i_id BIGINT; -- 根据实际类型调整 ``` #### 步骤3:检查ORM配置 - **命名策略配置(Spring Boot)**: ```yaml spring: jpa: hibernate: naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl # 禁用下划线转换 ``` 若需驼峰转下划线,改用`SpringPhysicalNamingStrategy`。 #### 步骤4:清理缓存并重启 - 清除Hibernate缓存: ```java entityManager.clear(); // 在代码中手动清理 ``` 重启应用确保所有配置生效。 --- ### 示例验证 **场景**:Swagger UI调用API时触发包含`i_id`的查询 **修复后SQL**: ```sql SELECT * FROM your_table WHERE i_id = 1; -- 列名正确映射 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值