From abeccd0390e1c6be4654b3db87e4809098b4f768 Mon Sep 17 00:00:00 2001 From: Evan Hu Date: Wed, 9 Sep 2026 09:45:59 +0900 Subject: [PATCH 1/6] build: upgrade spring boot to 4.1.1 and all dependencies to latest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 spring-boot-starter-parent 的伪导入换成 spring-boot-dependencies BOM 导入, 统一由 BOM 管理 spring / jackson / hibernate / junit 等版本。 - spring boot 2.5.12 -> 4.1.1, JDK 11 -> 21 - springfox-swagger 2.2.2 -> springdoc-openapi 3.1.1 (springfox 已停止维护且不支持 jakarta) - mysql:mysql-connector-java 8.0.28 -> com.mysql:mysql-connector-j 26.7.0 (groupId 变更) - dom4j:dom4j 1.6.1 -> org.dom4j:dom4j 2.2.0 (groupId 变更) - com.alibaba:fastjson -> com.alibaba.fastjson2:fastjson2 2.0.65 - poi 3.17 -> 5.5.1, jsoup -> 1.23.2, commons-io -> 2.22.0, commons-lang3 -> 3.20.0 - lombok -> 1.18.48, slf4j -> 2.0.19, zxing -> 3.5.4, mybatis-spring-boot -> 4.1.0 - maven 插件: compiler 3.5.1 -> 3.16.0, surefire 2.19.1 -> 3.6.0, source 3.2.0 -> 3.4.0 同时修掉三个既有问题: - jsoup.version 属性重复定义, 后一处 1.9.2 覆盖了前一处 1.14.2, 导致之前的 jsoup 升级实际未生效 - fastjson 和 commons-fileupload 使用开区间版本 [x,), 构建不可复现, 现已全部钉死 - 移除未被任何代码引用且不兼容 jakarta 的 commons-fileupload, 以及被 spring-boot-starter-test 取代的 junit4 knife4j (swagger-bootstrap-ui 的后继) 最新版 4.5.0 仍锁定 spring boot 3.0.4 与 springdoc 2.x, 无法与 spring boot 4 共存, 故移除, 改用 springdoc 自带的 swagger-ui。 --- core/pom.xml | 22 ++------ javase/pom.xml | 13 +---- mongodb/pom.xml | 8 +-- order/pom.xml | 16 +----- pom.xml | 136 ++++++++++++++++++++++------------------------- rabbitmq/pom.xml | 5 ++ website/pom.xml | 19 ++----- 7 files changed, 86 insertions(+), 133 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 8e3af9eb..fd441758 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -32,12 +32,8 @@ spring-boot-starter-test - junit - junit - - - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.slf4j @@ -48,27 +44,19 @@ commons-io - com.alibaba - fastjson + com.alibaba.fastjson2 + fastjson2 org.apache.commons commons-lang3 - - javax.mail - mail - - - commons-fileupload - commons-fileupload - org.projectlombok lombok - dom4j + org.dom4j dom4j diff --git a/javase/pom.xml b/javase/pom.xml index e3a3c480..bb661e0a 100644 --- a/javase/pom.xml +++ b/javase/pom.xml @@ -27,17 +27,8 @@ true - io.springfox - springfox-swagger2 - - - io.springfox - springfox-swagger-ui - - - com.github.xiaoymin - swagger-bootstrap-ui - 1.5 + org.springdoc + springdoc-openapi-starter-webmvc-ui diff --git a/mongodb/pom.xml b/mongodb/pom.xml index f3ade783..f3a6d998 100644 --- a/mongodb/pom.xml +++ b/mongodb/pom.xml @@ -21,12 +21,8 @@ spring-boot-starter-data-mongodb - io.springfox - springfox-swagger-ui - - - io.springfox - springfox-swagger2 + org.springdoc + springdoc-openapi-starter-webmvc-ui diff --git a/order/pom.xml b/order/pom.xml index fed4e2b0..4bf14122 100644 --- a/order/pom.xml +++ b/order/pom.xml @@ -21,29 +21,17 @@ spring-boot-devtools true - - io.springfox - springfox-swagger2 - - - io.springfox - springfox-swagger-ui - com.google.zxing javase - 3.2.1 com.google.zxing core - 3.3.3 - - com.github.xiaoymin - swagger-bootstrap-ui - 1.5 + org.springdoc + springdoc-openapi-starter-webmvc-ui diff --git a/pom.xml b/pom.xml index 5b1f7919..c8804fac 100644 --- a/pom.xml +++ b/pom.xml @@ -55,45 +55,40 @@ UTF-8 - 11 + 21 + + 4.1.1 + + 26.7.0 + 2.0.19 + 1.18.48 - 3.5 - - 4.13.1 - - 8.0.28 - - 1.7.21 - - 1.1.7 + 3.20.0 - 2.7 - - [1.3.3,) + 2.22.0 - [1.2.31,) - - 1.14.2 - - 2.5.12 - - 3.5.1 - - 2.19.1 - - 1.4.7 - - 1.18.14 + 2.0.65 + + 2.2.0 + + 1.23.2 - 2.2.2 + 3.1.1 + 4.5.0 - 1.1.1 - - 1.9.2 + 4.1.0 + + 3.5.4 2.6.12 - 3.17 + 5.5.1 + + 3.16.0 + + 3.6.0 + + 3.4.0 @@ -102,36 +97,30 @@ org.springframework.boot - spring-boot-starter-parent - ${spring-boot.version} - pom - - - org.springframework.boot - spring-boot-starter-web + spring-boot-dependencies ${spring-boot.version} pom import - dom4j + org.dom4j dom4j - 1.6.1 + ${dom4j.version} - junit - junit - ${junit.version} - test + com.mysql + mysql-connector-j + ${mysql-connector.version} - mysql - mysql-connector-java - ${mysql-connector} + org.slf4j + slf4j-api + ${slf4j.version} + org.slf4j - slf4j-api + jul-to-slf4j ${slf4j.version} @@ -140,9 +129,9 @@ ${commons-io.version} - com.alibaba - fastjson - ${fastjson.version} + com.alibaba.fastjson2 + fastjson2 + ${fastjson2.version} org.apache.commons @@ -150,31 +139,30 @@ ${common-lang3.version} - commons-fileupload - commons-fileupload - ${commons-fileupload.version} + org.projectlombok + lombok + ${lombok.version} + - javax.mail - mail - ${javax-mail.version} + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} - org.projectlombok - lombok - ${lombak.version} + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + ${knife4j.version} - - io.springfox - springfox-swagger-ui - ${springfox-swagger-ui.version} + com.google.zxing + core + ${zxing.version} - - io.springfox - springfox-swagger2 - ${springfox-swagger-ui.version} + com.google.zxing + javase + ${zxing.version} org.mybatis.spring.boot @@ -209,9 +197,15 @@ maven-compiler-plugin ${maven-compiler-plugin.version} - ${sources.version} - ${sources.version} + ${sources.version} ${project.build.sourceEncoding} + + + org.projectlombok + lombok + ${lombok.version} + + @@ -241,7 +235,7 @@ maven-source-plugin - 3.2.0 + ${maven-source-plugin.version} true diff --git a/rabbitmq/pom.xml b/rabbitmq/pom.xml index eed80ec6..a9b3990b 100644 --- a/rabbitmq/pom.xml +++ b/rabbitmq/pom.xml @@ -21,6 +21,11 @@ org.springframework.boot spring-boot-starter-amqp + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/website/pom.xml b/website/pom.xml index 3a00bf4f..e263399c 100644 --- a/website/pom.xml +++ b/website/pom.xml @@ -30,20 +30,7 @@ spring-boot-devtools true - - io.springfox - springfox-swagger2 - - - io.springfox - springfox-swagger-ui - - - com.github.xiaoymin - swagger-bootstrap-ui - 1.5 - - + org.springframework spring-webmvc @@ -55,6 +42,10 @@ org.springframework.boot spring-boot-starter-web + + org.springdoc + springdoc-openapi-starter-webmvc-ui + From 2ff99ed0e84b9eedf1f93e590e6eacd2908ed395 Mon Sep 17 00:00:00 2001 From: Evan Hu Date: Wed, 9 Sep 2026 09:46:13 +0900 Subject: [PATCH 2/6] refactor: migrate to jakarta namespace and spring boot 4 APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit spring boot 3 起 javax.* 全面迁移到 jakarta.*, 同时 spring boot 4 拆分了 autoconfigure 模块并默认改用 jackson 3, 一并适配。 - javax.persistence/servlet/mail/websocket -> jakarta.* (javax.sql / javax.net / javax.swing 属 JDK 自带, 保持不变) - @EntityScan -> org.springframework.boot.persistence.autoconfigure - DataSourceAutoConfiguration -> org.springframework.boot.jdbc.autoconfigure - HibernateJpaAutoConfiguration -> org.springframework.boot.hibernate.autoconfigure - jackson 2 -> 3: com.fasterxml.jackson.databind.JsonSerializer -> tools.jackson.databind.ValueSerializer, SerializerProvider -> SerializationContext, serialize 不再抛受检异常 - poi 5: HSSFCell.CELL_TYPE_* 常量 -> CellType 枚举, HSSFDateUtil -> DateUtil - fastjson -> fastjson2 (JSON / JSONObject 用法一致, 仅换包) - security: WebSecurityConfigurerAdapter 已被移除, 改用 SecurityFilterChain + UserDetailsService Bean。 内存用户密码补上 {noop} 前缀 —— 原先未指定编码器, 在 spring security 5 之后登录时会直接抛异常 - springfox Docket + ApiInfo -> springdoc GroupedOpenApi + OpenAPI Bean, 保留原有的 basePackage 分组范围 - swagger 注解升级到 OpenAPI 3: @Api -> @Tag, @ApiOperation -> @Operation, @ApiImplicitParam -> @Parameter, @ApiModelProperty -> @Schema, @ApiIgnore -> @Hidden - 唯一的测试从 JUnit 4 迁移到 JUnit 5 --- .../java/info/xiaomo/anysc/AsyncMain.java | 6 +- .../java/info/xiaomo/core/base/BaseModel.java | 2 +- .../info/xiaomo/core/filter/CorsFilter.java | 4 +- .../filter/CustomDateSerializerFilter.java | 13 ++- .../info/xiaomo/core/untils/AuthUtil.java | 2 +- .../info/xiaomo/core/untils/ExcelUtil.java | 15 ++-- .../info/xiaomo/core/untils/HttpUtil.java | 6 +- .../info/xiaomo/core/untils/MailUtil.java | 6 +- .../info/xiaomo/core/untils/StringUtil.java | 2 +- .../info/xiaomo/core/untils/TokenUtil.java | 2 +- .../java/info/xiaomo/core/untils/XmlUtil.java | 2 +- .../xiaomo/crawler/model/ShikigamiModel.java | 4 +- .../service/impl/ShikigamaServiceImpl.java | 2 +- .../xiaomo/freemarker/FreemarkerMain.java | 6 +- .../java/info/xiaomo/javase/QuestionMain.java | 50 +++++------ .../javase/controller/QuestionController.java | 19 ++-- .../xiaomo/javase/model/QuestionModel.java | 4 +- .../java/info/xiaomo/mongodb/MongodbMain.java | 53 +++++------ .../controller/MongoUserController.java | 4 +- .../info/xiaomo/mongodb/model/MongoUser.java | 22 ++--- .../java/info/xiaomo/mybatis/MybatisMain.java | 2 +- .../java/info/xiaomo/order/OrderMain.java | 50 +++++------ .../order/controller/OrderController.java | 20 +++-- .../info/xiaomo/order/model/OrderModel.java | 6 +- .../info/xiaomo/rabbitmq/RabbitMqMain.java | 4 +- .../src/test/java/test/RabbitMqTests.java | 2 +- .../java/info/xiaomo/redis/RedisMain.java | 4 +- .../java/info/xiaomo/redis/job/TaskJob.java | 2 +- .../info/xiaomo/scheduled/ScheduledMain.java | 4 +- .../info/xiaomo/security/SecurityMain.java | 56 +++++++----- .../main/java/info/xiaomo/chat/ChatMain.java | 6 +- .../info/xiaomo/chat/socket/MyWebSocket.java | 10 +-- .../info/xiaomo/thymeleaf/ThymeleafMain.java | 6 +- .../java/info/xiaomo/website/XiaomoMain.java | 50 +++++------ .../controller/AdminUserController.java | 90 ++++++++++--------- .../controller/ChangeLogController.java | 35 ++++---- .../website/controller/LinkController.java | 35 ++++---- .../controller/TechnologyController.java | 35 ++++---- .../website/controller/UserController.java | 49 +++++----- .../website/controller/WorksController.java | 35 ++++---- .../xiaomo/website/dao/base/CommonDao.java | 6 +- .../website/interceptor/LoginInterceptor.java | 4 +- .../info/xiaomo/website/model/AdminModel.java | 6 +- .../xiaomo/website/model/ChangeLogModel.java | 6 +- .../info/xiaomo/website/model/LinkModel.java | 6 +- .../xiaomo/website/model/TechnologyModel.java | 6 +- .../info/xiaomo/website/model/UserModel.java | 6 +- .../info/xiaomo/website/model/WorksModel.java | 6 +- .../info/xiaomo/website/util/MailUtil.java | 6 +- 49 files changed, 390 insertions(+), 387 deletions(-) diff --git a/async/src/main/java/info/xiaomo/anysc/AsyncMain.java b/async/src/main/java/info/xiaomo/anysc/AsyncMain.java index 79e1fce0..1e550e2f 100644 --- a/async/src/main/java/info/xiaomo/anysc/AsyncMain.java +++ b/async/src/main/java/info/xiaomo/anysc/AsyncMain.java @@ -3,9 +3,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/core/src/main/java/info/xiaomo/core/base/BaseModel.java b/core/src/main/java/info/xiaomo/core/base/BaseModel.java index 37d18bbe..02693895 100644 --- a/core/src/main/java/info/xiaomo/core/base/BaseModel.java +++ b/core/src/main/java/info/xiaomo/core/base/BaseModel.java @@ -2,7 +2,7 @@ import lombok.Data; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; import java.util.Date; diff --git a/core/src/main/java/info/xiaomo/core/filter/CorsFilter.java b/core/src/main/java/info/xiaomo/core/filter/CorsFilter.java index 75ccacf3..c70b4cd6 100644 --- a/core/src/main/java/info/xiaomo/core/filter/CorsFilter.java +++ b/core/src/main/java/info/xiaomo/core/filter/CorsFilter.java @@ -2,8 +2,8 @@ import org.springframework.stereotype.Component; -import javax.servlet.*; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/core/src/main/java/info/xiaomo/core/filter/CustomDateSerializerFilter.java b/core/src/main/java/info/xiaomo/core/filter/CustomDateSerializerFilter.java index e46cfb8f..d1e733ba 100644 --- a/core/src/main/java/info/xiaomo/core/filter/CustomDateSerializerFilter.java +++ b/core/src/main/java/info/xiaomo/core/filter/CustomDateSerializerFilter.java @@ -1,22 +1,21 @@ package info.xiaomo.core.filter; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; import info.xiaomo.core.untils.TimeUtil; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; /** * @author : xiaomo */ -public class CustomDateSerializerFilter extends JsonSerializer { +public class CustomDateSerializerFilter extends ValueSerializer { @Override - public void serialize(Date value, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException { + public void serialize(Date value, JsonGenerator jsonGenerator, SerializationContext context) { SimpleDateFormat sdf = new SimpleDateFormat(TimeUtil.DEFAULT_FORMAT2); jsonGenerator.writeString(sdf.format(value)); } -} \ No newline at end of file +} diff --git a/core/src/main/java/info/xiaomo/core/untils/AuthUtil.java b/core/src/main/java/info/xiaomo/core/untils/AuthUtil.java index 670f0d70..776f9a1a 100644 --- a/core/src/main/java/info/xiaomo/core/untils/AuthUtil.java +++ b/core/src/main/java/info/xiaomo/core/untils/AuthUtil.java @@ -1,6 +1,6 @@ package info.xiaomo.core.untils; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpSession; /** * 把今天最好的表现当作明天最新的起点..~ diff --git a/core/src/main/java/info/xiaomo/core/untils/ExcelUtil.java b/core/src/main/java/info/xiaomo/core/untils/ExcelUtil.java index 9a1738e3..f2c580c0 100644 --- a/core/src/main/java/info/xiaomo/core/untils/ExcelUtil.java +++ b/core/src/main/java/info/xiaomo/core/untils/ExcelUtil.java @@ -2,6 +2,7 @@ import org.apache.poi.hssf.usermodel.*; import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.ss.usermodel.DateUtil; import java.io.*; import java.text.DecimalFormat; @@ -83,11 +84,11 @@ private static String[][] getData(File file, int ignoreRows) cell = row.getCell(columnIndex); if (cell != null) { switch (cell.getCellType()) { - case HSSFCell.CELL_TYPE_STRING: + case STRING: value = cell.getStringCellValue(); break; - case HSSFCell.CELL_TYPE_NUMERIC: - if (HSSFDateUtil.isCellDateFormatted(cell)) { + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = new SimpleDateFormat("yyyy-MM-dd") @@ -100,7 +101,7 @@ private static String[][] getData(File file, int ignoreRows) .getNumericCellValue()); } break; - case HSSFCell.CELL_TYPE_FORMULA: + case FORMULA: // 导入时如果为公式生成的数据则无值 if (!"".equals(cell.getStringCellValue())) { value = cell.getStringCellValue(); @@ -108,12 +109,12 @@ private static String[][] getData(File file, int ignoreRows) value = cell.getNumericCellValue() + ""; } break; - case HSSFCell.CELL_TYPE_BLANK: + case BLANK: break; - case HSSFCell.CELL_TYPE_ERROR: + case ERROR: value = ""; break; - case HSSFCell.CELL_TYPE_BOOLEAN: + case BOOLEAN: value = (cell.getBooleanCellValue() ? "Y" : "N"); break; diff --git a/core/src/main/java/info/xiaomo/core/untils/HttpUtil.java b/core/src/main/java/info/xiaomo/core/untils/HttpUtil.java index 8257d22a..17cc0b8a 100644 --- a/core/src/main/java/info/xiaomo/core/untils/HttpUtil.java +++ b/core/src/main/java/info/xiaomo/core/untils/HttpUtil.java @@ -4,9 +4,9 @@ import org.apache.commons.lang3.StringUtils; import javax.net.ssl.*; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; diff --git a/core/src/main/java/info/xiaomo/core/untils/MailUtil.java b/core/src/main/java/info/xiaomo/core/untils/MailUtil.java index d4c36da7..1d0712d9 100644 --- a/core/src/main/java/info/xiaomo/core/untils/MailUtil.java +++ b/core/src/main/java/info/xiaomo/core/untils/MailUtil.java @@ -1,8 +1,8 @@ package info.xiaomo.core.untils; -import javax.mail.*; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; +import jakarta.mail.*; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; import java.io.FileInputStream; import java.io.IOException; import java.util.Date; diff --git a/core/src/main/java/info/xiaomo/core/untils/StringUtil.java b/core/src/main/java/info/xiaomo/core/untils/StringUtil.java index 5cf3fda8..b4a65ee0 100644 --- a/core/src/main/java/info/xiaomo/core/untils/StringUtil.java +++ b/core/src/main/java/info/xiaomo/core/untils/StringUtil.java @@ -2,7 +2,7 @@ import org.apache.commons.lang3.StringUtils; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.StringReader; import java.io.UnsupportedEncodingException; diff --git a/core/src/main/java/info/xiaomo/core/untils/TokenUtil.java b/core/src/main/java/info/xiaomo/core/untils/TokenUtil.java index d4707393..59d4e317 100644 --- a/core/src/main/java/info/xiaomo/core/untils/TokenUtil.java +++ b/core/src/main/java/info/xiaomo/core/untils/TokenUtil.java @@ -1,6 +1,6 @@ package info.xiaomo.core.untils; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSONObject; import info.xiaomo.core.constant.SymbolConst; import java.util.regex.Matcher; diff --git a/core/src/main/java/info/xiaomo/core/untils/XmlUtil.java b/core/src/main/java/info/xiaomo/core/untils/XmlUtil.java index 48fe446f..a62f4c4a 100644 --- a/core/src/main/java/info/xiaomo/core/untils/XmlUtil.java +++ b/core/src/main/java/info/xiaomo/core/untils/XmlUtil.java @@ -1,6 +1,6 @@ package info.xiaomo.core.untils; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; import org.dom4j.*; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; diff --git a/crawler/src/main/java/info/xiaomo/crawler/model/ShikigamiModel.java b/crawler/src/main/java/info/xiaomo/crawler/model/ShikigamiModel.java index b208fea5..dac85b6c 100644 --- a/crawler/src/main/java/info/xiaomo/crawler/model/ShikigamiModel.java +++ b/crawler/src/main/java/info/xiaomo/crawler/model/ShikigamiModel.java @@ -3,8 +3,8 @@ import info.xiaomo.core.base.BaseModel; import lombok.*; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; /** * @author : xiaomo (https://xiaomo.info) (https://github.com/houko) diff --git a/crawler/src/main/java/info/xiaomo/crawler/service/impl/ShikigamaServiceImpl.java b/crawler/src/main/java/info/xiaomo/crawler/service/impl/ShikigamaServiceImpl.java index 0a5bfe42..22e0393f 100644 --- a/crawler/src/main/java/info/xiaomo/crawler/service/impl/ShikigamaServiceImpl.java +++ b/crawler/src/main/java/info/xiaomo/crawler/service/impl/ShikigamaServiceImpl.java @@ -1,6 +1,6 @@ package info.xiaomo.crawler.service.impl; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; import info.xiaomo.crawler.dao.ShikigamaDao; import info.xiaomo.crawler.model.ShikigamiModel; import info.xiaomo.crawler.service.ShikigamaService; diff --git a/freemarker/src/main/java/info/xiaomo/freemarker/FreemarkerMain.java b/freemarker/src/main/java/info/xiaomo/freemarker/FreemarkerMain.java index d1e9d83c..f1bba291 100644 --- a/freemarker/src/main/java/info/xiaomo/freemarker/FreemarkerMain.java +++ b/freemarker/src/main/java/info/xiaomo/freemarker/FreemarkerMain.java @@ -2,9 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/javase/src/main/java/info/xiaomo/javase/QuestionMain.java b/javase/src/main/java/info/xiaomo/javase/QuestionMain.java index 7cda0422..215f87a1 100644 --- a/javase/src/main/java/info/xiaomo/javase/QuestionMain.java +++ b/javase/src/main/java/info/xiaomo/javase/QuestionMain.java @@ -1,9 +1,14 @@ package info.xiaomo.javase; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import org.springdoc.core.models.GroupedOpenApi; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.Operation; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -13,14 +18,6 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * 把今天最好的表现当作明天最新的起点..~ @@ -41,7 +38,6 @@ @ComponentScan("info.xiaomo") @EntityScan("info.xiaomo.*.model") @EnableJpaRepositories("info.xiaomo.*.dao") -@EnableSwagger2 @RestController public class QuestionMain implements WebMvcConfigurer { @@ -55,31 +51,29 @@ public static void main(String[] args) { * @return 接口 */ @RequestMapping(value = "/", method = RequestMethod.GET) - @ApiIgnore() - @ApiOperation(value = "重定向到api首页") + @Hidden + @Operation(summary = "重定向到api首页") public ModelAndView api() { return new ModelAndView("redirect:/swagger-ui.html"); } @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage("info.xiaomo.javase")) - .paths(PathSelectors.any()) + public GroupedOpenApi javaseApi() { + return GroupedOpenApi.builder() + .group("javase") + .packagesToScan("info.xiaomo.javase") .build(); } - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("Spring Boot中使用Swagger2构建RESTful APIs") - .description("java se题库api") - .termsOfServiceUrl("https://question.xiaomo.info/") - .contact("小莫") - .version("1.0") - .build(); + @Bean + public OpenAPI openApi() { + return new OpenAPI() + .info(new Info() + .title("Spring Boot中使用OpenAPI构建RESTful APIs") + .description("java se题库api") + .termsOfService("https://question.xiaomo.info/") + .contact(new Contact().name("小莫")) + .version("1.0")); } - } diff --git a/javase/src/main/java/info/xiaomo/javase/controller/QuestionController.java b/javase/src/main/java/info/xiaomo/javase/controller/QuestionController.java index d76c4876..2dddf244 100644 --- a/javase/src/main/java/info/xiaomo/javase/controller/QuestionController.java +++ b/javase/src/main/java/info/xiaomo/javase/controller/QuestionController.java @@ -1,13 +1,14 @@ package info.xiaomo.javase.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.Result; import info.xiaomo.core.constant.CodeConst; import info.xiaomo.javase.model.QuestionModel; import info.xiaomo.javase.service.QuestionService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; @@ -27,7 +28,7 @@ */ @RestController @RequestMapping("/question") -@Api(value = "question", description = "question") +@Tag(name = "question", description = "question") public class QuestionController { @@ -44,10 +45,10 @@ public QuestionController(QuestionService service) { * @param id id * @return result */ - @ApiOperation(value = "查找问题", notes = "查找问题", httpMethod = "GET") + @Operation(summary = "查找问题", description = "查找问题") @RequestMapping(value = "findById/{id}", method = RequestMethod.GET) - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path"), + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH), }) public Result findUserById(@PathVariable("id") Long id) { QuestionModel questionModel = service.findById(id); @@ -62,7 +63,7 @@ public Result findUserById(@PathVariable("id") Long id) { * * @return result */ - @ApiOperation(value = "添加", notes = "添加", httpMethod = "POST") + @Operation(summary = "添加", description = "添加") @RequestMapping(value = "findById/{id}", method = RequestMethod.POST) public Result addQuestion(@RequestBody QuestionModel questionModel) { boolean add = service.add(questionModel); diff --git a/javase/src/main/java/info/xiaomo/javase/model/QuestionModel.java b/javase/src/main/java/info/xiaomo/javase/model/QuestionModel.java index 39954ae5..512d99c4 100644 --- a/javase/src/main/java/info/xiaomo/javase/model/QuestionModel.java +++ b/javase/src/main/java/info/xiaomo/javase/model/QuestionModel.java @@ -4,8 +4,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import java.io.Serializable; /** diff --git a/mongodb/src/main/java/info/xiaomo/mongodb/MongodbMain.java b/mongodb/src/main/java/info/xiaomo/mongodb/MongodbMain.java index 0f6c1c2e..641f5eb7 100644 --- a/mongodb/src/main/java/info/xiaomo/mongodb/MongodbMain.java +++ b/mongodb/src/main/java/info/xiaomo/mongodb/MongodbMain.java @@ -1,12 +1,17 @@ package info.xiaomo.mongodb; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import org.springdoc.core.models.GroupedOpenApi; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.Operation; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -14,14 +19,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * 把今天最好的表现当作明天最新的起点..~ @@ -41,7 +38,6 @@ @ComponentScan("info.xiaomo") @EntityScan("info.xiaomo.*.model") @RestController -@EnableSwagger2 @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) public class MongodbMain { public static void main(String[] args) throws Exception { @@ -49,29 +45,28 @@ public static void main(String[] args) throws Exception { } @RequestMapping(value = "/", method = RequestMethod.GET) - @ApiIgnore() - @ApiOperation(value = "重定向到api首页") + @Hidden + @Operation(summary = "重定向到api首页") public ModelAndView index() { return new ModelAndView("redirect:/swagger-ui.html"); } @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage("info.xiaomo.mongodb")) - .paths(PathSelectors.any()) + public GroupedOpenApi mongodbApi() { + return GroupedOpenApi.builder() + .group("mongodb") + .packagesToScan("info.xiaomo.mongodb") .build(); } - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("Spring Boot中使用Swagger2构建RESTful APIs") - .description("使用mongodb构建api接口") - .termsOfServiceUrl("https://xiaomo.info/") - .contact("小莫") - .version("1.0") - .build(); + @Bean + public OpenAPI openApi() { + return new OpenAPI() + .info(new Info() + .title("Spring Boot中使用OpenAPI构建RESTful APIs") + .description("使用mongodb构建api接口") + .termsOfService("https://xiaomo.info/") + .contact(new Contact().name("小莫")) + .version("1.0")); } } diff --git a/mongodb/src/main/java/info/xiaomo/mongodb/controller/MongoUserController.java b/mongodb/src/main/java/info/xiaomo/mongodb/controller/MongoUserController.java index a7056409..f1d16e6e 100644 --- a/mongodb/src/main/java/info/xiaomo/mongodb/controller/MongoUserController.java +++ b/mongodb/src/main/java/info/xiaomo/mongodb/controller/MongoUserController.java @@ -1,10 +1,10 @@ package info.xiaomo.mongodb.controller; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.Result; import info.xiaomo.core.constant.CodeConst; import info.xiaomo.mongodb.model.MongoUser; import info.xiaomo.mongodb.service.MongoUserService; -import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -24,7 +24,7 @@ @RestController @RequestMapping("mongodb") -@Api("mongodb測試") +@Tag(name = "mongodb測試") public class MongoUserController { private final MongoUserService service; diff --git a/mongodb/src/main/java/info/xiaomo/mongodb/model/MongoUser.java b/mongodb/src/main/java/info/xiaomo/mongodb/model/MongoUser.java index 12095176..3d86e3d3 100644 --- a/mongodb/src/main/java/info/xiaomo/mongodb/model/MongoUser.java +++ b/mongodb/src/main/java/info/xiaomo/mongodb/model/MongoUser.java @@ -1,6 +1,6 @@ package info.xiaomo.mongodb.model; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -32,33 +32,33 @@ public class MongoUser { @Id private int id; - @ApiModelProperty(value = "登录用户") + @Schema(description = "登录用户") private String email; - @ApiModelProperty(value = "昵称") + @Schema(description = "昵称") private String userName; - @ApiModelProperty(value = "密码") + @Schema(description = "密码") private String password; - @ApiModelProperty(value = "盐值") + @Schema(description = "盐值") private String salt; - @ApiModelProperty(value = "激活码") + @Schema(description = "激活码") private String validateCode; - @ApiModelProperty(value = "性别:1男2女0保密") + @Schema(description = "性别:1男2女0保密") private int gender = 0; - @ApiModelProperty(value = "电话") + @Schema(description = "电话") private Long phone = 0L; - @ApiModelProperty(value = "图片地址") + @Schema(description = "图片地址") private String imgUrl = ""; - @ApiModelProperty(value = "地址") + @Schema(description = "地址") private String address = ""; - @ApiModelProperty(value = "注册时间(时间戳)") + @Schema(description = "注册时间(时间戳)") private Long registerTime = 0L; } diff --git a/mybatis/src/main/java/info/xiaomo/mybatis/MybatisMain.java b/mybatis/src/main/java/info/xiaomo/mybatis/MybatisMain.java index b87e5e65..9ca3b963 100644 --- a/mybatis/src/main/java/info/xiaomo/mybatis/MybatisMain.java +++ b/mybatis/src/main/java/info/xiaomo/mybatis/MybatisMain.java @@ -2,7 +2,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/order/src/main/java/info/xiaomo/order/OrderMain.java b/order/src/main/java/info/xiaomo/order/OrderMain.java index d6311aba..6b06485e 100644 --- a/order/src/main/java/info/xiaomo/order/OrderMain.java +++ b/order/src/main/java/info/xiaomo/order/OrderMain.java @@ -1,11 +1,16 @@ package info.xiaomo.order; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import org.springdoc.core.models.GroupedOpenApi; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.Operation; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -14,14 +19,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; /** @@ -30,7 +27,6 @@ @Configuration @ComponentScan("info.xiaomo") @EntityScan("info.xiaomo.*.model") -@EnableSwagger2 @Controller @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) public class OrderMain implements WebMvcConfigurer { @@ -45,29 +41,27 @@ public static void main(String[] args) { * @return 接口 */ @RequestMapping(value = "/", method = RequestMethod.GET) - @ApiIgnore() - @ApiOperation(value = "重定向到api首页") + @Hidden + @Operation(summary = "重定向到api首页") public ModelAndView api() { return new ModelAndView("redirect:/swagger-ui.html"); } @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage("info.xiaomo.order")) - .paths(PathSelectors.any()) + public GroupedOpenApi orderApi() { + return GroupedOpenApi.builder() + .group("order") + .packagesToScan("info.xiaomo.order") .build(); } - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("Spring Boot中使用Swagger2构建RESTful APIs") - .contact("小莫") - .version("1.0") - .build(); + @Bean + public OpenAPI openApi() { + return new OpenAPI() + .info(new Info() + .title("Spring Boot中使用OpenAPI构建RESTful APIs") + .contact(new Contact().name("小莫")) + .version("1.0")); } - } diff --git a/order/src/main/java/info/xiaomo/order/controller/OrderController.java b/order/src/main/java/info/xiaomo/order/controller/OrderController.java index 416d1c4d..0c1f5fe2 100644 --- a/order/src/main/java/info/xiaomo/order/controller/OrderController.java +++ b/order/src/main/java/info/xiaomo/order/controller/OrderController.java @@ -1,8 +1,14 @@ package info.xiaomo.order.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.Result; import info.xiaomo.order.service.OrderService; -import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; @@ -16,7 +22,7 @@ */ @RestController @RequestMapping("/order") -@Api(value = "识别订单") +@Tag(name = "识别订单") public class OrderController { private final OrderService service; @@ -28,13 +34,13 @@ public OrderController(OrderService orderService) { @RequestMapping(value = "forbid/{id}", method = RequestMethod.GET) - @ApiOperation(value = "封号", notes = "根据传入的id对修改对应帐号状态", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "后台用户唯一id", required = true, dataType = "Long", paramType = "path") + @Operation(summary = "封号", description = "根据传入的id对修改对应帐号状态") + @Parameters({ + @Parameter(name = "id", description = "后台用户唯一id", required = true, in = ParameterIn.PATH) }) @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result forbid(@PathVariable("id") Long id) { return new Result<>(null); diff --git a/order/src/main/java/info/xiaomo/order/model/OrderModel.java b/order/src/main/java/info/xiaomo/order/model/OrderModel.java index 22b8cba9..d2762190 100644 --- a/order/src/main/java/info/xiaomo/order/model/OrderModel.java +++ b/order/src/main/java/info/xiaomo/order/model/OrderModel.java @@ -4,9 +4,9 @@ import info.xiaomo.core.base.BaseModel; import lombok.*; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import java.io.Serializable; /** diff --git a/rabbitmq/src/main/java/info/xiaomo/rabbitmq/RabbitMqMain.java b/rabbitmq/src/main/java/info/xiaomo/rabbitmq/RabbitMqMain.java index 7030a585..2ee7eb30 100644 --- a/rabbitmq/src/main/java/info/xiaomo/rabbitmq/RabbitMqMain.java +++ b/rabbitmq/src/main/java/info/xiaomo/rabbitmq/RabbitMqMain.java @@ -3,8 +3,8 @@ import org.springframework.amqp.core.Queue; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/rabbitmq/src/test/java/test/RabbitMqTests.java b/rabbitmq/src/test/java/test/RabbitMqTests.java index f95714a7..1e2ddab8 100644 --- a/rabbitmq/src/test/java/test/RabbitMqTests.java +++ b/rabbitmq/src/test/java/test/RabbitMqTests.java @@ -1,7 +1,7 @@ package test; import info.xiaomo.rabbitmq.config.Sender; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; public class RabbitMqTests { diff --git a/redis/src/main/java/info/xiaomo/redis/RedisMain.java b/redis/src/main/java/info/xiaomo/redis/RedisMain.java index 1f42cee6..eb2e4380 100644 --- a/redis/src/main/java/info/xiaomo/redis/RedisMain.java +++ b/redis/src/main/java/info/xiaomo/redis/RedisMain.java @@ -2,8 +2,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/redis/src/main/java/info/xiaomo/redis/job/TaskJob.java b/redis/src/main/java/info/xiaomo/redis/job/TaskJob.java index 11244433..5156ef92 100644 --- a/redis/src/main/java/info/xiaomo/redis/job/TaskJob.java +++ b/redis/src/main/java/info/xiaomo/redis/job/TaskJob.java @@ -1,6 +1,6 @@ package info.xiaomo.redis.job; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; import info.xiaomo.redis.model.CityInfo; import info.xiaomo.redis.service.CityService; import org.slf4j.Logger; diff --git a/scheduled/src/main/java/info/xiaomo/scheduled/ScheduledMain.java b/scheduled/src/main/java/info/xiaomo/scheduled/ScheduledMain.java index ada6b33a..04777c96 100644 --- a/scheduled/src/main/java/info/xiaomo/scheduled/ScheduledMain.java +++ b/scheduled/src/main/java/info/xiaomo/scheduled/ScheduledMain.java @@ -2,8 +2,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; diff --git a/security/src/main/java/info/xiaomo/security/SecurityMain.java b/security/src/main/java/info/xiaomo/security/SecurityMain.java index 01e306a3..2e07c2ec 100644 --- a/security/src/main/java/info/xiaomo/security/SecurityMain.java +++ b/security/src/main/java/info/xiaomo/security/SecurityMain.java @@ -1,18 +1,22 @@ package info.xiaomo.security; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; /** * 把今天最好的表现当作明天最新的起点..~ @@ -33,30 +37,34 @@ @ComponentScan("info.xiaomo") @EntityScan("info.xiaomo.*.model") @EnableWebSecurity -public class SecurityMain extends WebSecurityConfigurerAdapter { +public class SecurityMain { public static void main(String[] args) throws Exception { SpringApplication.run(SecurityMain.class, args); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/", "/home").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .loginPage("/login") - .permitAll() - .and() - .logout() - .permitAll(); + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + return http + .authorizeHttpRequests(requests -> requests + .requestMatchers("/", "/home").permitAll() + .anyRequest().authenticated()) + .formLogin(login -> login + .loginPage("/login") + .permitAll()) + .logout(Customizer.withDefaults()) + .build(); } - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("test").password("test").roles("USER"); + /** + * 演示用的内存用户。{noop} 前缀表示密码不加密, 仅适用于示例, 生产环境请改用 BCryptPasswordEncoder。 + */ + @Bean + public UserDetailsService userDetailsService() { + UserDetails user = User.withUsername("test") + .password("{noop}test") + .roles("USER") + .build(); + return new InMemoryUserDetailsManager(user); } - } diff --git a/socket/src/main/java/info/xiaomo/chat/ChatMain.java b/socket/src/main/java/info/xiaomo/chat/ChatMain.java index b144a642..bd9287ca 100644 --- a/socket/src/main/java/info/xiaomo/chat/ChatMain.java +++ b/socket/src/main/java/info/xiaomo/chat/ChatMain.java @@ -2,9 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/socket/src/main/java/info/xiaomo/chat/socket/MyWebSocket.java b/socket/src/main/java/info/xiaomo/chat/socket/MyWebSocket.java index 57dcd631..8d6dee18 100644 --- a/socket/src/main/java/info/xiaomo/chat/socket/MyWebSocket.java +++ b/socket/src/main/java/info/xiaomo/chat/socket/MyWebSocket.java @@ -7,11 +7,11 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import javax.websocket.OnClose; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.server.ServerEndpoint; +import jakarta.websocket.OnClose; +import jakarta.websocket.OnMessage; +import jakarta.websocket.OnOpen; +import jakarta.websocket.Session; +import jakarta.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; diff --git a/thymeleaf/src/main/java/info/xiaomo/thymeleaf/ThymeleafMain.java b/thymeleaf/src/main/java/info/xiaomo/thymeleaf/ThymeleafMain.java index a561841f..e48270de 100644 --- a/thymeleaf/src/main/java/info/xiaomo/thymeleaf/ThymeleafMain.java +++ b/thymeleaf/src/main/java/info/xiaomo/thymeleaf/ThymeleafMain.java @@ -2,9 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/website/src/main/java/info/xiaomo/website/XiaomoMain.java b/website/src/main/java/info/xiaomo/website/XiaomoMain.java index 1d2c5aa7..5bbf6d65 100644 --- a/website/src/main/java/info/xiaomo/website/XiaomoMain.java +++ b/website/src/main/java/info/xiaomo/website/XiaomoMain.java @@ -1,10 +1,15 @@ package info.xiaomo.website; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import org.springdoc.core.models.GroupedOpenApi; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.Operation; import info.xiaomo.website.view.UserView; -import io.swagger.annotations.ApiOperation; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -16,14 +21,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * 把今天最好的表现当作明天最新的起点..~ @@ -46,7 +43,6 @@ @EnableTransactionManagement @EnableJpaRepositories("info.xiaomo.*.dao") @EnableCaching -@EnableSwagger2 @Controller public class XiaomoMain implements WebMvcConfigurer { @@ -65,31 +61,29 @@ public String index() { * @return 接口 */ @RequestMapping(value = "/api", method = RequestMethod.GET) - @ApiIgnore() - @ApiOperation(value = "重定向到api首页") + @Hidden + @Operation(summary = "重定向到api首页") public ModelAndView api() { return new ModelAndView("redirect:/swagger-ui.html"); } @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage("info.xiaomo.website")) - .paths(PathSelectors.any()) + public GroupedOpenApi websiteApi() { + return GroupedOpenApi.builder() + .group("website") + .packagesToScan("info.xiaomo.website") .build(); } - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("Spring Boot中使用Swagger2构建RESTful APIs") - .description("api根地址:http://api.xiaomo.info:8080/") - .termsOfServiceUrl("https://xiaomo.info/") - .contact("小莫") - .version("1.0") - .build(); + @Bean + public OpenAPI openApi() { + return new OpenAPI() + .info(new Info() + .title("Spring Boot中使用OpenAPI构建RESTful APIs") + .description("api根地址:http://api.xiaomo.info:8080/") + .termsOfService("https://xiaomo.info/") + .contact(new Contact().name("小莫")) + .version("1.0")); } - } diff --git a/website/src/main/java/info/xiaomo/website/controller/AdminUserController.java b/website/src/main/java/info/xiaomo/website/controller/AdminUserController.java index c79e934b..c6c7780e 100644 --- a/website/src/main/java/info/xiaomo/website/controller/AdminUserController.java +++ b/website/src/main/java/info/xiaomo/website/controller/AdminUserController.java @@ -1,5 +1,12 @@ package info.xiaomo.website.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.BaseController; import info.xiaomo.core.base.Result; import info.xiaomo.core.constant.CodeConst; @@ -8,7 +15,6 @@ import info.xiaomo.core.untils.RandomUtil; import info.xiaomo.website.model.AdminModel; import info.xiaomo.website.service.AdminUserService; -import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.http.MediaType; @@ -40,7 +46,7 @@ */ @RestController @RequestMapping("/adminUser") -@Api(value = "后台用户相关api", description = "后台用户相关api") +@Tag(name = "后台用户相关api", description = "后台用户相关api") public class AdminUserController extends BaseController { private final AdminUserService service; @@ -56,14 +62,14 @@ public AdminUserController(AdminUserService service) { * @return Result */ @RequestMapping(value = "login/{userName}/{password}", method = RequestMethod.POST) - @ApiOperation(value = "获取用户信息", notes = "根据用户帐号和密码登录后台", httpMethod = "POST") - @ApiImplicitParams({ - @ApiImplicitParam(name = "userName", value = "用户名", required = true, dataType = "Result", paramType = "path"), - @ApiImplicitParam(name = "password", value = "用户名", required = true, dataType = "Result", paramType = "path") + @Operation(summary = "获取用户信息", description = "根据用户帐号和密码登录后台") + @Parameters({ + @Parameter(name = "userName", description = "用户名", required = true, in = ParameterIn.PATH), + @Parameter(name = "password", description = "用户名", required = true, in = ParameterIn.PATH) }) @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result login(@PathVariable("userName") String userName, @PathVariable("password") String password) { AdminModel adminModel = service.findAdminUserByUserName(userName); @@ -82,11 +88,11 @@ public Result login(@PathVariable("userName") String userName, @Path * * @return Result */ - @ApiOperation(value = "添加后台用户", notes = "传一个管理员用户模型过来然后保存到数据库", httpMethod = "POST") + @Operation(summary = "添加后台用户", description = "传一个管理员用户模型过来然后保存到数据库") @RequestMapping(value = "add", method = RequestMethod.POST) @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result add(@RequestBody AdminModel model) { AdminModel adminModel = service.findAdminUserByUserName(model.getUserName()); @@ -106,14 +112,14 @@ public Result add(@RequestBody AdminModel model) { * @param id id * @return Result */ - @ApiOperation(value = "查找用户", notes = "根据传来的id查找用户并返回", httpMethod = "GET") + @Operation(summary = "查找用户", description = "根据传来的id查找用户并返回") @RequestMapping(value = "findById/{id}", method = RequestMethod.GET) - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "后台用户唯一id", required = true, dataType = "Long", paramType = "path") + @Parameters({ + @Parameter(name = "id", description = "后台用户唯一id", required = true, in = ParameterIn.PATH) }) @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result findUserById(@PathVariable("id") Long id) { AdminModel adminModel = service.findAdminUserById(id); @@ -163,14 +169,14 @@ public Result findById(@PathVariable Long id) { * @return Result */ @Override - @ApiOperation(value = "查找用户", notes = "根据传来的用户名查找用户并返回", httpMethod = "GET") + @Operation(summary = "查找用户", description = "根据传来的用户名查找用户并返回") @RequestMapping(value = "findByName/{userName}", method = RequestMethod.GET) - @ApiImplicitParams({ - @ApiImplicitParam(name = "userName", value = "用户名", required = true, dataType = "String", paramType = "path") + @Parameters({ + @Parameter(name = "userName", description = "用户名", required = true, in = ParameterIn.PATH) }) @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result findByName(@PathVariable("userName") String userName) { AdminModel adminModel = service.findAdminUserByUserName(userName); @@ -242,10 +248,10 @@ public Result delByIds(@PathVariable List ids) { * @throws UserNotFoundException UserNotFoundException */ @RequestMapping(value = "changePassword", method = RequestMethod.POST) - @ApiOperation(value = "修改用户密码", notes = "传来模型验证并修改密码", httpMethod = "POST") + @Operation(summary = "修改用户密码", description = "传来模型验证并修改密码") @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result changePassword(@RequestBody AdminModel model) throws UserNotFoundException { AdminModel adminModel = service.findAdminUserByUserName(model.getUserName()); @@ -266,10 +272,10 @@ public Result changePassword(@RequestBody AdminModel model) throws UserNotFoundE * @return 不分页 */ @RequestMapping(value = "findAll", method = RequestMethod.GET) - @ApiOperation(value = "返回所有用户信息", notes = "不分页", httpMethod = "GET") + @Operation(summary = "返回所有用户信息", description = "不分页") @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result getAll() { List pages = service.getAdminUsers(); @@ -287,13 +293,13 @@ public Result getAll() { * @throws UserNotFoundException UserNotFoundException */ @RequestMapping(value = "delete/{id}", method = RequestMethod.GET) - @ApiOperation(value = "删除用户", notes = "根据传入的id删除对应的用户", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "用户唯一id", required = true, dataType = "Long", paramType = "path") + @Operation(summary = "删除用户", description = "根据传入的id删除对应的用户") + @Parameters({ + @Parameter(name = "id", description = "用户唯一id", required = true, in = ParameterIn.PATH) }) @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result deleteUserById(@PathVariable("id") Long id) throws UserNotFoundException { AdminModel adminModel = service.findAdminUserById(id); @@ -312,13 +318,13 @@ public Result deleteUserById(@PathVariable("id") Long id) throws UserNotFoundExc * @throws UserNotFoundException UserNotFoundException */ @RequestMapping(value = "update/{userName}", method = RequestMethod.POST) - @ApiOperation(value = "更新用户信息", notes = "根据传入的模型更新用户信息", httpMethod = "POST") - @ApiImplicitParams({ - @ApiImplicitParam(name = "userName", value = "用户名", required = true, dataType = "String", paramType = "path") + @Operation(summary = "更新用户信息", description = "根据传入的模型更新用户信息") + @Parameters({ + @Parameter(name = "userName", description = "用户名", required = true, in = ParameterIn.PATH) }) @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result update(@PathVariable("userName") String userName) throws UserNotFoundException { AdminModel adminModel = service.findAdminUserByUserName(userName); @@ -338,13 +344,13 @@ public Result update(@PathVariable("userName") String userName) throws UserNotFo * @throws UserNotFoundException UserNotFoundException */ @RequestMapping(value = "forbid/{id}", method = RequestMethod.GET) - @ApiOperation(value = "封号", notes = "根据传入的id对修改对应帐号状态", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "后台用户唯一id", required = true, dataType = "Long", paramType = "path") + @Operation(summary = "封号", description = "根据传入的id对修改对应帐号状态") + @Parameters({ + @Parameter(name = "id", description = "后台用户唯一id", required = true, in = ParameterIn.PATH) }) @ApiResponses(value = { - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 400, message = "No Name Provided"), + @ApiResponse(responseCode = "404", description = "Not Found"), + @ApiResponse(responseCode = "400", description = "No Name Provided"), }) public Result forbid(@PathVariable("id") Long id) throws UserNotFoundException { AdminModel model = service.findAdminUserById(id); diff --git a/website/src/main/java/info/xiaomo/website/controller/ChangeLogController.java b/website/src/main/java/info/xiaomo/website/controller/ChangeLogController.java index 86452ba6..04c057b7 100644 --- a/website/src/main/java/info/xiaomo/website/controller/ChangeLogController.java +++ b/website/src/main/java/info/xiaomo/website/controller/ChangeLogController.java @@ -1,14 +1,15 @@ package info.xiaomo.website.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.BaseController; import info.xiaomo.core.base.Result; import info.xiaomo.core.constant.CodeConst; import info.xiaomo.website.model.ChangeLogModel; import info.xiaomo.website.service.ChangeLogService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.http.MediaType; @@ -32,7 +33,7 @@ **/ @RestController @RequestMapping("/changeLog") -@Api(value = "更新日志相关api", description = "更新日志相关api") +@Tag(name = "更新日志相关api", description = "更新日志相关api") public class ChangeLogController extends BaseController { private final ChangeLogService service; @@ -50,9 +51,9 @@ public ChangeLogController(ChangeLogService service) { */ @Override @RequestMapping(value = "findById/{id}", method = RequestMethod.GET) - @ApiOperation(value = "通过id查找", notes = "通过id查找", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path") + @Operation(summary = "通过id查找", description = "通过id查找") + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH) }) public Result findById(@PathVariable("id") Long id) { ChangeLogModel changeLogModel = service.findById(id); @@ -69,9 +70,9 @@ public Result findById(@PathVariable("id") Long id) { */ @Override @RequestMapping(value = "findByName/{name}", method = RequestMethod.GET) - @ApiOperation(value = "通过名字查找", notes = "通过名字查找", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "name", value = "更新日志内容", required = true, dataType = "String", paramType = "path") + @Operation(summary = "通过名字查找", description = "通过名字查找") + @Parameters({ + @Parameter(name = "name", description = "更新日志内容", required = true, in = ParameterIn.PATH) }) public Result findByName(@PathVariable("name") String name) { ChangeLogModel model = service.findByName(name); @@ -143,7 +144,7 @@ public Result delByIds(@PathVariable List ids) { */ @Override @RequestMapping(value = "findAll", method = RequestMethod.GET) - @ApiOperation(value = "分页查询更新日志", notes = "分页查询更新日志", httpMethod = "GET") + @Operation(summary = "分页查询更新日志", description = "分页查询更新日志") public Result findAll() { List pages = service.findAll(); if (pages == null || pages.size() <= 0) { @@ -169,7 +170,7 @@ public Result findAll(@PathVariable int start, @PathVariable int pageSize) * * @return result */ - @ApiOperation(value = "增加更新日志", notes = "增加更新日志", httpMethod = "POST") + @Operation(summary = "增加更新日志", description = "增加更新日志") @RequestMapping(value = "add", method = RequestMethod.POST) public Result add(@RequestBody ChangeLogModel model) { ChangeLogModel changeLogModel = service.findByName(model.getName()); @@ -189,7 +190,7 @@ public Result add(@RequestBody ChangeLogModel model) { * * @return result */ - @ApiOperation(value = "修改更新日志", notes = "修改更新日志", httpMethod = "POST") + @Operation(summary = "修改更新日志", description = "修改更新日志") @RequestMapping(value = "update", method = RequestMethod.POST) public Result update(@RequestBody ChangeLogModel model) { ChangeLogModel changeLogModel = service.findByName(model.getName()); @@ -207,9 +208,9 @@ public Result update(@RequestBody ChangeLogModel model) { * 删除更新日志 */ @RequestMapping(value = "delete/{id}", method = RequestMethod.GET) - @ApiOperation(value = "删除更新日志", notes = "删除更新日志", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path") + @Operation(summary = "删除更新日志", description = "删除更新日志") + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH) }) public Result deleteById(@PathVariable("id") Long id) { ChangeLogModel changeLogModel = service.findById(id); diff --git a/website/src/main/java/info/xiaomo/website/controller/LinkController.java b/website/src/main/java/info/xiaomo/website/controller/LinkController.java index 1afd6385..35049bd8 100644 --- a/website/src/main/java/info/xiaomo/website/controller/LinkController.java +++ b/website/src/main/java/info/xiaomo/website/controller/LinkController.java @@ -1,14 +1,15 @@ package info.xiaomo.website.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.BaseController; import info.xiaomo.core.base.Result; import info.xiaomo.core.constant.CodeConst; import info.xiaomo.website.model.LinkModel; import info.xiaomo.website.service.LinkService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.http.MediaType; @@ -32,7 +33,7 @@ **/ @RestController @RequestMapping("/link") -@Api(value = "友情链接相关api", description = "友情链接相关api") +@Tag(name = "友情链接相关api", description = "友情链接相关api") public class LinkController extends BaseController { private final LinkService service; @@ -49,9 +50,9 @@ public LinkController(LinkService service) { * @return model */ @RequestMapping(value = "findById/{id}", method = RequestMethod.GET) - @ApiOperation(value = "通过id查找", notes = "通过id查找", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path") + @Operation(summary = "通过id查找", description = "通过id查找") + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH) }) public Result findLinkById(@PathVariable("id") Long id) { LinkModel model = service.findById(id); @@ -69,9 +70,9 @@ public Result findLinkById(@PathVariable("id") Long id) { */ @Override @RequestMapping(value = "findByName/{name}", method = RequestMethod.GET) - @ApiOperation(value = "根据名字查找", notes = "根据名字查找", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "name", value = "友情链接名字", required = true, dataType = "String", paramType = "path") + @Operation(summary = "根据名字查找", description = "根据名字查找") + @Parameters({ + @Parameter(name = "name", description = "友情链接名字", required = true, in = ParameterIn.PATH) }) public Result findByName(@PathVariable("name") String name) { LinkModel model = service.findByName(name); @@ -144,7 +145,7 @@ public Result delByIds(@PathVariable List ids) { */ @Override @RequestMapping(value = "findAll", method = RequestMethod.GET) - @ApiOperation(value = "返回所有数据", notes = "返回所有数据", httpMethod = "GET") + @Operation(summary = "返回所有数据", description = "返回所有数据") public Result findAll() { List pages = service.findAll(); if (pages == null || pages.size() == 0) { @@ -182,7 +183,7 @@ public Result findById(@PathVariable Long id) { * @return model */ @RequestMapping(value = "add", method = RequestMethod.POST) - @ApiOperation(value = "添加链接", notes = "添加链接", httpMethod = "POST") + @Operation(summary = "添加链接", description = "添加链接") public Result add(@RequestBody LinkModel model) { LinkModel linkModel = service.findByName(model.getName()); if (linkModel != null) { @@ -200,7 +201,7 @@ public Result add(@RequestBody LinkModel model) { * * @return model */ - @ApiOperation(value = "更新链接", notes = "更新链接", httpMethod = "POST") + @Operation(summary = "更新链接", description = "更新链接") @RequestMapping(value = "update", method = RequestMethod.POST) public Result update(@RequestBody LinkModel model) { LinkModel linkModel = service.findById(model.getId()); @@ -220,9 +221,9 @@ public Result update(@RequestBody LinkModel model) { * @return model */ @RequestMapping(value = "delete/{id}", method = RequestMethod.GET) - @ApiOperation(value = "删除链接", notes = "删除链接", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path") + @Operation(summary = "删除链接", description = "删除链接") + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH) }) public Result delete(@PathVariable("id") Long id) { LinkModel linkmodel = service.findById(id); diff --git a/website/src/main/java/info/xiaomo/website/controller/TechnologyController.java b/website/src/main/java/info/xiaomo/website/controller/TechnologyController.java index 46601a9a..e2103313 100644 --- a/website/src/main/java/info/xiaomo/website/controller/TechnologyController.java +++ b/website/src/main/java/info/xiaomo/website/controller/TechnologyController.java @@ -1,14 +1,15 @@ package info.xiaomo.website.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.BaseController; import info.xiaomo.core.base.Result; import info.xiaomo.core.constant.CodeConst; import info.xiaomo.website.model.TechnologyModel; import info.xiaomo.website.service.TechnologyService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.http.MediaType; @@ -33,7 +34,7 @@ @RestController @RequestMapping("/technology") -@Api(value = "技术中心相关api", description = "技术中心相关api") +@Tag(name = "技术中心相关api", description = "技术中心相关api") public class TechnologyController extends BaseController { private final TechnologyService service; @@ -44,10 +45,10 @@ public TechnologyController(TechnologyService service) { @Override - @ApiOperation(value = "根据id查找技术", notes = "根据id查找技术", httpMethod = "GET") + @Operation(summary = "根据id查找技术", description = "根据id查找技术") @RequestMapping(value = "/findById/{id}", method = RequestMethod.GET) - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一Id", required = true, dataType = "Long", paramType = "path") + @Parameters({ + @Parameter(name = "id", description = "唯一Id", required = true, in = ParameterIn.PATH) }) public Result findById(@PathVariable Long id) { TechnologyModel model = service.findById(id); @@ -58,10 +59,10 @@ public Result findById(@PathVariable Long id) { } @Override - @ApiOperation(value = "根据名字查找技术", notes = "根据名字查找技术", httpMethod = "GET") + @Operation(summary = "根据名字查找技术", description = "根据名字查找技术") @RequestMapping(value = "/findByName/{name}", method = RequestMethod.GET) - @ApiImplicitParams({ - @ApiImplicitParam(name = "name", value = "技术名字", required = true, dataType = "name", paramType = "path") + @Parameters({ + @Parameter(name = "name", description = "技术名字", required = true, in = ParameterIn.PATH) }) public Result findByName(@PathVariable String name) { TechnologyModel model = service.findByName(name); @@ -127,7 +128,7 @@ public Result delByIds(@PathVariable List ids) { } @Override - @ApiOperation(value = "查找所有", notes = "查找所有", httpMethod = "GET") + @Operation(summary = "查找所有", description = "查找所有") @RequestMapping(value = "/findAll", method = RequestMethod.GET) public Result findAll() { List all = service.findAll(); @@ -150,7 +151,7 @@ public Result findAll(@PathVariable int start, @PathVariable int pageSize) } - @ApiOperation(value = "添加链接", notes = "添加链接", httpMethod = "POST") + @Operation(summary = "添加链接", description = "添加链接") @RequestMapping(value = "/add", method = RequestMethod.POST) public Result add(@RequestBody TechnologyModel model) { TechnologyModel addModel = service.findByName(model.getName()); @@ -161,7 +162,7 @@ public Result add(@RequestBody TechnologyModel model) { return new Result<>(addModel); } - @ApiOperation(value = "更新链接", notes = "更新链接", httpMethod = "POST") + @Operation(summary = "更新链接", description = "更新链接") @RequestMapping(value = "/update", method = RequestMethod.POST) public Result update(@RequestBody TechnologyModel model) { TechnologyModel update = service.findById(model.getId()); @@ -174,9 +175,9 @@ public Result update(@RequestBody TechnologyModel model) { @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) - @ApiOperation(value = "删除链接", notes = "删除链接", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path") + @Operation(summary = "删除链接", description = "删除链接") + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH) }) public Result delete(@PathVariable Long id) { TechnologyModel model = service.findById(id); diff --git a/website/src/main/java/info/xiaomo/website/controller/UserController.java b/website/src/main/java/info/xiaomo/website/controller/UserController.java index 5a4ca6d9..f51720d8 100644 --- a/website/src/main/java/info/xiaomo/website/controller/UserController.java +++ b/website/src/main/java/info/xiaomo/website/controller/UserController.java @@ -1,5 +1,10 @@ package info.xiaomo.website.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.BaseController; import info.xiaomo.core.base.Result; import info.xiaomo.core.constant.CodeConst; @@ -11,10 +16,6 @@ import info.xiaomo.core.untils.TimeUtil; import info.xiaomo.website.model.UserModel; import info.xiaomo.website.service.UserService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; import org.hibernate.service.spi.ServiceException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -40,7 +41,7 @@ **/ @RestController @RequestMapping("/user") -@Api(value = "用户相关api", description = "用户相关api") +@Tag(name = "用户相关api", description = "用户相关api") public class UserController extends BaseController { private final UserService service; @@ -56,10 +57,10 @@ public UserController(UserService service) { * @param id id * @return result */ - @ApiOperation(value = "查找用户", notes = "查找用户", httpMethod = "GET") + @Operation(summary = "查找用户", description = "查找用户") @RequestMapping(value = "findById/{id}", method = RequestMethod.GET) - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path"), + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH), }) @SuppressWarnings("unchecked") public Result findUserById(@PathVariable("id") Long id) { @@ -70,7 +71,7 @@ public Result findUserById(@PathVariable("id") Long id) { /** * 添加用户 */ - @ApiOperation(value = "添加用户", notes = "添加用户", httpMethod = "POST") + @Operation(summary = "添加用户", description = "添加用户") @RequestMapping(value = "addUser", method = RequestMethod.POST) public Result addUser(@RequestBody UserModel user) { UserModel userModel = service.findUserByEmail(user.getEmail()); @@ -90,10 +91,10 @@ public Result addUser(@RequestBody UserModel user) { * * @return result */ - @ApiOperation(value = "注册", notes = "注册用户并发送验证链接到邮箱", httpMethod = "POST") - @ApiImplicitParams({ - @ApiImplicitParam(name = "用户名", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "密码", required = true, dataType = "String", paramType = "path") + @Operation(summary = "注册", description = "注册用户并发送验证链接到邮箱") + @Parameters({ + @Parameter(name = "用户名", required = true, in = ParameterIn.PATH), + @Parameter(name = "密码", required = true, in = ParameterIn.PATH) }) @RequestMapping(value = "register/{email}/{password}", method = RequestMethod.POST) public Result register(@PathVariable("email") String email, @PathVariable("password") String password) { @@ -113,10 +114,10 @@ public Result register(@PathVariable("email") String email, @PathVariable("passw * * @return result */ - @ApiOperation(value = "登录", notes = "登录", httpMethod = "POST") - @ApiImplicitParams({ - @ApiImplicitParam(name = "email", value = "邮箱", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String", paramType = "path") + @Operation(summary = "登录", description = "登录") + @Parameters({ + @Parameter(name = "email", description = "邮箱", required = true, in = ParameterIn.PATH), + @Parameter(name = "password", description = "密码", required = true, in = ParameterIn.PATH) }) @RequestMapping(value = "login/{email}/{password}", method = RequestMethod.POST) public Result login(@PathVariable("email") String email, @PathVariable("password") String password) { @@ -139,7 +140,7 @@ public Result login(@PathVariable("email") String email, @PathVariable("password * @return model * @throws UserNotFoundException UserNotFoundException */ - @ApiOperation(value = "修改密码", notes = "修改密码", httpMethod = "POST") + @Operation(summary = "修改密码", description = "修改密码") @RequestMapping(value = "changePassword", method = RequestMethod.POST) public Result changePassword(@RequestBody UserModel user) throws UserNotFoundException { UserModel userByEmail = service.findUserByEmail(user.getEmail()); @@ -160,7 +161,7 @@ public Result changePassword(@RequestBody UserModel user) throws UserNotFoundExc * @return model * @throws UserNotFoundException UserNotFoundException */ - @ApiOperation(value = "更新用户信息", notes = "更新用户信息", httpMethod = "POST") + @Operation(summary = "更新用户信息", description = "更新用户信息") @RequestMapping(value = "update", method = RequestMethod.POST) public Result update(@RequestBody UserModel user) throws UserNotFoundException { UserModel userModel = service.findUserByEmail(user.getEmail()); @@ -183,7 +184,7 @@ public Result update(@RequestBody UserModel user) throws UserNotFoundException { * * @return result */ - @ApiOperation(value = "返回所有用户数据", notes = "返回所有用户数据", httpMethod = "GET") + @Operation(summary = "返回所有用户数据", description = "返回所有用户数据") @RequestMapping(value = "findAll", method = RequestMethod.GET) public Result getAll() { List pages = service.findAll(); @@ -201,9 +202,9 @@ public Result getAll() { * @return result */ @RequestMapping(value = "delete/{id}", method = RequestMethod.GET) - @ApiOperation(value = "根据id删除用户", notes = "根据id删除用户", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path"), + @Operation(summary = "根据id删除用户", description = "根据id删除用户") + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH), }) public Result deleteUserById(@PathVariable("id") Long id) throws UserNotFoundException { UserModel userModel = service.deleteUserById(id); @@ -216,7 +217,7 @@ public Result deleteUserById(@PathVariable("id") Long id) throws UserNotFoundExc /** * 处理激活 */ - @ApiOperation(value = "处理激活", notes = "处理激活", httpMethod = "POST") + @Operation(summary = "处理激活", description = "处理激活") @RequestMapping(value = "validateEmail", method = RequestMethod.POST) public Result validateEmail(@RequestBody UserModel user ) throws ServiceException { diff --git a/website/src/main/java/info/xiaomo/website/controller/WorksController.java b/website/src/main/java/info/xiaomo/website/controller/WorksController.java index 9817f244..3b60d502 100644 --- a/website/src/main/java/info/xiaomo/website/controller/WorksController.java +++ b/website/src/main/java/info/xiaomo/website/controller/WorksController.java @@ -1,13 +1,14 @@ package info.xiaomo.website.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; import info.xiaomo.core.base.Result; import info.xiaomo.core.constant.CodeConst; import info.xiaomo.website.model.WorksModel; import info.xiaomo.website.service.WorksService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -30,7 +31,7 @@ @RequestMapping("/works") @RestController -@Api(value = "作品相关api") +@Tag(name = "作品相关api") public class WorksController { private final WorksService service; @@ -42,9 +43,9 @@ public WorksController(WorksService service) { @RequestMapping(value = "/findById/{id}", method = RequestMethod.GET) - @ApiOperation(value = "根据id查找作品", notes = "根据id查找作品", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path"), + @Operation(summary = "根据id查找作品", description = "根据id查找作品") + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH), }) public Result findById(@PathVariable Long id) { WorksModel model = service.findById(id); @@ -55,7 +56,7 @@ public Result findById(@PathVariable Long id) { } @RequestMapping(value = "/findAll", method = RequestMethod.GET) - @ApiOperation(value = "查找所有", notes = "查找所有", httpMethod = "GET") + @Operation(summary = "查找所有", description = "查找所有") public Result> findAll() { List all = service.findAll(); if (all == null || all.isEmpty()) { @@ -66,9 +67,9 @@ public Result> findAll() { @RequestMapping(value = "/findByName/{name}", method = RequestMethod.GET) - @ApiOperation(value = "根据名字查找作品", notes = "根据名字查找作品", httpMethod = "GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "name", value = "作品名字", required = true, dataType = "String", paramType = "path"), + @Operation(summary = "根据名字查找作品", description = "根据名字查找作品") + @Parameters({ + @Parameter(name = "name", description = "作品名字", required = true, in = ParameterIn.PATH), }) public Result findByName(@PathVariable String name) { WorksModel model = service.findByName(name); @@ -78,7 +79,7 @@ public Result findByName(@PathVariable String name) { return new Result<>(model); } - @ApiOperation(value = "添加作品", notes = "添加作品", httpMethod = "POST") + @Operation(summary = "添加作品", description = "添加作品") @RequestMapping(value = "/add", method = RequestMethod.POST) public Result add(@RequestBody WorksModel model) { WorksModel addModel = service.findByName(model.getName()); @@ -89,7 +90,7 @@ public Result add(@RequestBody WorksModel model) { return new Result<>(addModel); } - @ApiOperation(value = "更新作品", notes = "更新作品", httpMethod = "POST") + @Operation(summary = "更新作品", description = "更新作品") @RequestMapping(value = "/update", method = RequestMethod.POST) public Result update(@RequestBody WorksModel model) { WorksModel worksModel = service.findById(model.getId()); @@ -101,10 +102,10 @@ public Result update(@RequestBody WorksModel model) { } - @ApiOperation(value = "根据id删除作品", notes = "根据id删除作品", httpMethod = "GET") + @Operation(summary = "根据id删除作品", description = "根据id删除作品") @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path"), + @Parameters({ + @Parameter(name = "id", description = "唯一id", required = true, in = ParameterIn.PATH), }) public Result delete(@PathVariable Long id) { WorksModel model = service.findById(id); diff --git a/website/src/main/java/info/xiaomo/website/dao/base/CommonDao.java b/website/src/main/java/info/xiaomo/website/dao/base/CommonDao.java index f208448f..437ca7c7 100644 --- a/website/src/main/java/info/xiaomo/website/dao/base/CommonDao.java +++ b/website/src/main/java/info/xiaomo/website/dao/base/CommonDao.java @@ -4,9 +4,9 @@ import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; import java.util.List; /** diff --git a/website/src/main/java/info/xiaomo/website/interceptor/LoginInterceptor.java b/website/src/main/java/info/xiaomo/website/interceptor/LoginInterceptor.java index a981ef75..f284ea3d 100644 --- a/website/src/main/java/info/xiaomo/website/interceptor/LoginInterceptor.java +++ b/website/src/main/java/info/xiaomo/website/interceptor/LoginInterceptor.java @@ -4,8 +4,8 @@ import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** diff --git a/website/src/main/java/info/xiaomo/website/model/AdminModel.java b/website/src/main/java/info/xiaomo/website/model/AdminModel.java index 7209d379..6f9b3bdf 100644 --- a/website/src/main/java/info/xiaomo/website/model/AdminModel.java +++ b/website/src/main/java/info/xiaomo/website/model/AdminModel.java @@ -4,9 +4,9 @@ import info.xiaomo.core.base.BaseModel; import lombok.*; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import java.io.Serializable; /** diff --git a/website/src/main/java/info/xiaomo/website/model/ChangeLogModel.java b/website/src/main/java/info/xiaomo/website/model/ChangeLogModel.java index bfc74198..a7937c76 100644 --- a/website/src/main/java/info/xiaomo/website/model/ChangeLogModel.java +++ b/website/src/main/java/info/xiaomo/website/model/ChangeLogModel.java @@ -4,9 +4,9 @@ import info.xiaomo.core.base.BaseModel; import lombok.*; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import java.io.Serializable; /** diff --git a/website/src/main/java/info/xiaomo/website/model/LinkModel.java b/website/src/main/java/info/xiaomo/website/model/LinkModel.java index 5907fff0..aaa31851 100644 --- a/website/src/main/java/info/xiaomo/website/model/LinkModel.java +++ b/website/src/main/java/info/xiaomo/website/model/LinkModel.java @@ -4,9 +4,9 @@ import info.xiaomo.core.base.BaseModel; import lombok.*; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import java.io.Serializable; /** diff --git a/website/src/main/java/info/xiaomo/website/model/TechnologyModel.java b/website/src/main/java/info/xiaomo/website/model/TechnologyModel.java index ad3d9e05..b2b91573 100644 --- a/website/src/main/java/info/xiaomo/website/model/TechnologyModel.java +++ b/website/src/main/java/info/xiaomo/website/model/TechnologyModel.java @@ -4,9 +4,9 @@ import info.xiaomo.core.base.BaseModel; import lombok.*; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; /** * 把今天最好的表现当作明天最新的起点..~ diff --git a/website/src/main/java/info/xiaomo/website/model/UserModel.java b/website/src/main/java/info/xiaomo/website/model/UserModel.java index 1dfba5b9..8f7df5cc 100644 --- a/website/src/main/java/info/xiaomo/website/model/UserModel.java +++ b/website/src/main/java/info/xiaomo/website/model/UserModel.java @@ -4,9 +4,9 @@ import info.xiaomo.core.base.BaseModel; import lombok.*; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import java.io.Serializable; /** diff --git a/website/src/main/java/info/xiaomo/website/model/WorksModel.java b/website/src/main/java/info/xiaomo/website/model/WorksModel.java index 6fef0f0e..28ef1b1b 100644 --- a/website/src/main/java/info/xiaomo/website/model/WorksModel.java +++ b/website/src/main/java/info/xiaomo/website/model/WorksModel.java @@ -4,9 +4,9 @@ import info.xiaomo.core.base.BaseModel; import lombok.*; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; /** * 把今天最好的表现当作明天最新的起点..~ diff --git a/website/src/main/java/info/xiaomo/website/util/MailUtil.java b/website/src/main/java/info/xiaomo/website/util/MailUtil.java index d338d6d1..fb04cb15 100644 --- a/website/src/main/java/info/xiaomo/website/util/MailUtil.java +++ b/website/src/main/java/info/xiaomo/website/util/MailUtil.java @@ -7,9 +7,9 @@ import org.slf4j.LoggerFactory; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; -import javax.mail.*; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; +import jakarta.mail.*; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; import java.io.FileInputStream; import java.io.IOException; import java.util.Date; From f200db769891aa743b88da37652d2072c6a7c7ad Mon Sep 17 00:00:00 2001 From: Evan Hu Date: Wed, 9 Sep 2026 09:46:21 +0900 Subject: [PATCH 3/6] fix: update renamed spring boot properties and hibernate dialect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这些配置编译期不会报错, 但在 spring boot 4 上会静默失效或直接启动失败。 - spring.redis.* -> spring.data.redis.* (spring boot 2.4 起改名) - spring.redis.pool.* -> spring.data.redis.lettuce.pool.* (原写法是 spring boot 1.x 的名字, 早已失效) - org.hibernate.dialect.MySQL5Dialect -> MySQLDialect (MySQL5Dialect 在 hibernate 6 已被移除, 当前为 7.4.5) --- .../resources/config/application.properties | 2 +- .../resources/config/application.properties | 12 +++++------ .../resources/config/application.properties | 18 ++++++++--------- .../resources/config/application.properties | 20 +++++++++---------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/crawler/src/main/resources/config/application.properties b/crawler/src/main/resources/config/application.properties index 8d5bd3e7..aaf2db14 100644 --- a/crawler/src/main/resources/config/application.properties +++ b/crawler/src/main/resources/config/application.properties @@ -13,6 +13,6 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #spring.jackson.time-zone=GMT+8 #jpa -spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect +spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true diff --git a/javase/src/main/resources/config/application.properties b/javase/src/main/resources/config/application.properties index 34b74282..4c4c40cc 100644 --- a/javase/src/main/resources/config/application.properties +++ b/javase/src/main/resources/config/application.properties @@ -11,16 +11,16 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #spring.jackson.date-format=yyyy-MM-dd HH:mm:ss #spring.jackson.time-zone=GMT+8 #jpa -spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect +spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl # redis # Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09 -spring.redis.database=0 -spring.redis.host=ip -spring.redis.port=6379 -spring.redis.password= +spring.data.redis.database=0 +spring.data.redis.host=ip +spring.data.redis.port=6379 +spring.data.redis.password= # \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 #spring.redis.pool.max-active=8 ## \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 @@ -30,4 +30,4 @@ spring.redis.password= ## \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5 #spring.redis.pool.min-idle=0 # \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 -spring.redis.timeout=0 +spring.data.redis.timeout=0 diff --git a/redis/src/main/resources/config/application.properties b/redis/src/main/resources/config/application.properties index 7721fe42..05fdb197 100644 --- a/redis/src/main/resources/config/application.properties +++ b/redis/src/main/resources/config/application.properties @@ -5,15 +5,15 @@ server.max-http-header-size=20971520 # redis # Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09 -spring.redis.database=0 -spring.redis.host=ip -spring.redis.port=6379 +spring.data.redis.database=0 +spring.data.redis.host=ip +spring.data.redis.port=6379 # Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09 -spring.redis.password= +spring.data.redis.password= # \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 -spring.redis.pool.max-active=8 +spring.data.redis.lettuce.pool.max-active=8 # \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 -spring.redis.pool.max-wait=-1 -spring.redis.pool.max-idle=8 -spring.redis.pool.min-idle=0 -spring.redis.timeout=0 \ No newline at end of file +spring.data.redis.lettuce.pool.max-wait=-1 +spring.data.redis.lettuce.pool.max-idle=8 +spring.data.redis.lettuce.pool.min-idle=0 +spring.data.redis.timeout=0 \ No newline at end of file diff --git a/website/src/main/resources/config/application.properties b/website/src/main/resources/config/application.properties index f830f53d..bab40874 100644 --- a/website/src/main/resources/config/application.properties +++ b/website/src/main/resources/config/application.properties @@ -14,7 +14,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #spring.jackson.time-zone=GMT+8 #jpa -spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect +spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl @@ -22,20 +22,20 @@ spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.Ph # redis # Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09 -spring.redis.database=0 -spring.redis.host=ip -spring.redis.port=6379 -spring.redis.password= +spring.data.redis.database=0 +spring.data.redis.host=ip +spring.data.redis.port=6379 +spring.data.redis.password= # \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 -spring.redis.pool.max-active=8 +spring.data.redis.lettuce.pool.max-active=8 # \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 -spring.redis.pool.max-wait=-1 +spring.data.redis.lettuce.pool.max-wait=-1 # \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5 -spring.redis.pool.max-idle=8 +spring.data.redis.lettuce.pool.max-idle=8 # \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5 -spring.redis.pool.min-idle=0 +spring.data.redis.lettuce.pool.min-idle=0 # \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 -spring.redis.timeout=0 +spring.data.redis.timeout=0 #\u90AE\u4EF6 mail.host=smtp.163.com From 346a7ca92f4f402d217084d8e6c1d2de87372ce3 Mon Sep 17 00:00:00 2001 From: Evan Hu Date: Wed, 9 Sep 2026 09:46:21 +0900 Subject: [PATCH 4/6] ci: update github actions and document new toolchain requirements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - actions/checkout v3 -> v7, github/codeql-action v2 -> v4 (v2 已停止服务) - 新增 actions/setup-java 固定 JDK 21, 不再依赖 runner 镜像的默认 JDK, 否则 spring boot 4 所需的 JDK 17+ 无法保证 - travis: oraclejdk11 -> openjdk21, dist trusty -> jammy - Readme 环境说明与更新日志同步到本次升级 --- .github/workflows/codeql-analysis.yml | 16 ++++++++++++---- .travis.yml | 4 ++-- Readme.md | 9 +++++++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 98313f13..66f6d42d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,11 +38,19 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v7 + + # Spring Boot 4 需要 JDK 17+, 显式固定版本, 不依赖 runner 镜像的默认 JDK + - name: Set up JDK + uses: actions/setup-java@v6 + with: + distribution: temurin + java-version: '21' + cache: maven # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -56,7 +64,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v4 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -69,4 +77,4 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v4 diff --git a/.travis.yml b/.travis.yml index 34d145f8..98afce14 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ language: java jdk: - - oraclejdk11 -dist: trusty \ No newline at end of file + - openjdk21 +dist: jammy diff --git a/Readme.md b/Readme.md index 6c81e74e..593d5d7b 100644 --- a/Readme.md +++ b/Readme.md @@ -8,8 +8,8 @@ ### 环境 - `maven` latest -- `jdk11` -- `spring boot 2.x release` +- `jdk21` +- `spring boot 4.x release` - 个人推荐`idea`来代替eclipse - git: 版本管理 - nginx: 反向代理服务器 @@ -71,6 +71,11 @@ http://localhost:808/doc.html bootstrap-ui - 2020-10-09 升级mysql connector到8 - 2020-10-09 升级spring boot到2.3.0 - 2020-10-09 修复了升级后API的破坏性变动,修复了一些了编辑器警告 +- 2026-09-09 升级spring boot到4.1.1,jdk升级到21,全部依赖更新到最新版本 +- 2026-09-09 `javax.*` 迁移到 `jakarta.*`(persistence/servlet/mail/websocket) +- 2026-09-09 api文档从已停止维护的springfox迁移到springdoc-openapi,swagger注解升级到OpenAPI 3 +- 2026-09-09 security模块改用SecurityFilterChain组件式配置,替换已移除的WebSecurityConfigurerAdapter +- 2026-09-09 fastjson迁移到fastjson2,jackson升级到3.x,poi升级到5.x,dom4j迁移到org.dom4j From 01aded0917f9b06cb105b03ede421f9058ae311e Mon Sep 17 00:00:00 2001 From: Evan Hu Date: Wed, 9 Sep 2026 09:52:57 +0900 Subject: [PATCH 5/6] ci: add maven build workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 仓库此前没有任何构建 CI: 唯一的 workflow 是 CodeQL(安全扫描), 而 Readme 上的 Travis 徽章指向 travis-ci.org —— 该站 2021 年 6 月已关停, 徽章长期是死链。 也就是说没有任何 CI 会去编译这个项目。 新增 build workflow, 在 JDK 21(编译目标) 和 25(当前 LTS) 上跑 mvn clean install, 并把 Readme 徽章换成该 workflow 的状态。 保留 .travis.yml 未动(本次已同步更新其 jdk 版本), 是否弃用 travis 由仓库主人决定。 --- .github/workflows/build.yml | 32 ++++++++++++++++++++++++++++++++ Readme.md | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..ff7855e9 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,32 @@ +name: Build + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + name: Build (JDK ${{ matrix.java }}) + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + # 21 是项目的编译目标, 25 用于提前发现新 JDK 上的问题 + java: [ '21', '25' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v6 + with: + distribution: temurin + java-version: ${{ matrix.java }} + cache: maven + + - name: Build + run: mvn -B --no-transfer-progress clean install diff --git a/Readme.md b/Readme.md index 593d5d7b..0fe2ca28 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/houko/SpringBootUnity.svg?branch=main)](https://travis-ci.org/houko/SpringBootUnity) +[![Build](https://github.com/houko/SpringBootUnity/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/houko/SpringBootUnity/actions/workflows/build.yml) [![Backers on Open Collective](https://opencollective.com/SpringBootUnity/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/SpringBootUnity/sponsors/badge.svg)](#sponsors) [![GitHub issues](https://img.shields.io/github/issues/houko/SpringBootUnity.svg)](https://github.com/houko/SpringBootUnity/issues) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/houko/SpringBootUnity/main/LICENSE) [![Maven Central](https://img.shields.io/maven-central/v/org.apache.maven/apache-maven.svg)]() From b66658711d544b6f92a7e40e250c7eada6b75fb6 Mon Sep 17 00:00:00 2001 From: Evan Hu Date: Wed, 9 Sep 2026 09:55:48 +0900 Subject: [PATCH 6/6] ci: allow codeql workflow to be triggered manually MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 该 workflow 自 2022 年加入以来一次都没运行过, 加上 workflow_dispatch 便于手动验证和排查。 --- .github/workflows/codeql-analysis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 66f6d42d..e92a4f85 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -19,6 +19,7 @@ on: branches: [ "main" ] schedule: - cron: '24 7 * * 0' + workflow_dispatch: jobs: analyze: