diff --git a/pom.xml b/pom.xml
index 25656d8..2c42af3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 3.4.0
+ 3.5.11
@@ -17,7 +17,7 @@
imyeyu.com API
- 3.4.0
+ 3.5.11
21
21
UTF-8
@@ -122,12 +122,12 @@
com.imyeyu.spring
timi-spring
- 0.0.2
+ 0.0.9
com.imyeyu.network
timi-network
- 0.0.2
+ 0.0.8
com.imyeyu.lang
@@ -184,12 +184,12 @@
org.eclipse.jgit
org.eclipse.jgit
- 6.7.0.202309050840-r
+ 7.2.1.202505142326-r
org.eclipse.jgit
org.eclipse.jgit.archive
- 6.7.0.202309050840-r
+ 7.2.1.202505142326-r
org.apache.commons
@@ -220,7 +220,7 @@
org.apache.tika
tika-core
- 2.9.2
+ 3.2.2
org.jcodec
diff --git a/src/main/java/com/imyeyu/api/bean/IOCBeans.java b/src/main/java/com/imyeyu/api/bean/IOCBeans.java
deleted file mode 100644
index 6447e08..0000000
--- a/src/main/java/com/imyeyu/api/bean/IOCBeans.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.imyeyu.api.bean;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.stereotype.Component;
-import org.yaml.snakeyaml.Yaml;
-
-/**
- * @author 夜雨
- * @since 2025-01-13 11:42
- */
-@Component
-public class IOCBeans {
-
- @Bean
- public Yaml yaml() {
- return new Yaml();
- }
-}
diff --git a/src/main/java/com/imyeyu/api/config/BeanConfig.java b/src/main/java/com/imyeyu/api/config/BeanConfig.java
index 4965856..b7f6a96 100644
--- a/src/main/java/com/imyeyu/api/config/BeanConfig.java
+++ b/src/main/java/com/imyeyu/api/config/BeanConfig.java
@@ -1,7 +1,12 @@
package com.imyeyu.api.config;
-import com.google.gson.Gson;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.imyeyu.utils.Time;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.yaml.snakeyaml.Yaml;
/**
* @author 夜雨
@@ -10,7 +15,17 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
- public Gson gson() {
- return new Gson();
+ @Bean
+ public ObjectMapper jackson() {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.setDateFormat(Time.dateTime);
+ mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+ mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ return mapper;
+ }
+
+ @Bean
+ public Yaml yaml() {
+ return new Yaml();
}
}
diff --git a/src/main/java/com/imyeyu/api/config/RedisConfig.java b/src/main/java/com/imyeyu/api/config/RedisConfig.java
index ec69cbf..4efa999 100644
--- a/src/main/java/com/imyeyu/api/config/RedisConfig.java
+++ b/src/main/java/com/imyeyu/api/config/RedisConfig.java
@@ -6,6 +6,7 @@ import com.imyeyu.spring.bean.RedisConfigParams;
import com.imyeyu.spring.config.AbstractRedisConfig;
import com.imyeyu.spring.util.Redis;
import com.imyeyu.spring.util.RedisSerializers;
+import io.lettuce.core.api.StatefulConnection;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
@@ -155,12 +156,13 @@ public class RedisConfig extends AbstractRedisConfig {
/** @return 连接池配置 */
@Bean
@Override
- public GenericObjectPoolConfig> getPoolConfig() {
- GenericObjectPoolConfig> config = new GenericObjectPoolConfig<>();
- config.setMaxTotal(lettuce.pool.maxActive);
- config.setMinIdle(lettuce.pool.minIdle);
- config.setMaxIdle(lettuce.pool.maxIdle);
- config.setMaxWait(Duration.ofMillis(lettuce.pool.maxWait));
+ public GenericObjectPoolConfig> getPoolConfig() {
+ RedisConfigParams configArgs = configParams();
+ GenericObjectPoolConfig> config = new GenericObjectPoolConfig<>();
+ config.setMaxTotal(8);
+ config.setMinIdle(configArgs.getMinIdle());
+ config.setMaxIdle(configArgs.getMaxIdle());
+ config.setMaxWait(Duration.ofMillis(-1));
return config;
}
@@ -224,7 +226,7 @@ public class RedisConfig extends AbstractRedisConfig {
/** @return 文章访问统计,文章 ID: {@link ArticleRanking}(JSON) */
@Bean("redisArticleRanking")
public Redis getArticleRankingRedisTemplate() {
- return getRedis(database.articleRanking, RedisSerializers.LONG, RedisSerializers.gsonSerializer(ArticleRanking.class));
+ return getRedis(database.articleRanking, RedisSerializers.LONG, RedisSerializers.jacksonSerializer(ArticleRanking.class));
}
/** @return 文章访问记录,IP: [文章 ID] */
diff --git a/src/main/java/com/imyeyu/api/config/WebConfig.java b/src/main/java/com/imyeyu/api/config/WebConfig.java
index 0fcf267..9b35628 100644
--- a/src/main/java/com/imyeyu/api/config/WebConfig.java
+++ b/src/main/java/com/imyeyu/api/config/WebConfig.java
@@ -1,32 +1,28 @@
package com.imyeyu.api.config;
-import com.google.gson.GsonBuilder;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
import com.imyeyu.api.annotation.EnableSettingInterceptor;
import com.imyeyu.api.annotation.RequestRateLimitInterceptor;
import com.imyeyu.api.annotation.RequiredTokenInterceptor;
-import com.imyeyu.api.modules.common.entity.Attachment;
-import com.imyeyu.api.modules.common.vo.user.UserProfileView;
-import com.imyeyu.api.modules.common.vo.user.UserView;
import com.imyeyu.api.modules.journal.util.JournalAPIInterceptor;
import com.imyeyu.api.modules.minecraft.annotation.RequiredFMCServerTokenInterceptor;
-import com.imyeyu.api.modules.minecraft.entity.MinecraftPlayer;
-import com.imyeyu.api.modules.mirror.vo.MirrorView;
import com.imyeyu.api.modules.system.util.SystemAPIInterceptor;
-import com.imyeyu.api.util.GsonSerializerAdapter;
-import com.imyeyu.spring.annotation.RequestSingleParamResolver;
-import jakarta.validation.constraints.NotNull;
-import lombok.NonNull;
+import com.imyeyu.spring.annotation.RequestBodyValueArgumentResolver;
+import com.imyeyu.utils.Time;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
-import org.springframework.http.converter.json.GsonHttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-import java.io.Writer;
-import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
import java.util.List;
/**
@@ -40,12 +36,11 @@ import java.util.List;
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
+ private final ObjectMapper jackson;
private final SystemAPIInterceptor systemAPIInterceptor;
- private final GsonSerializerAdapter gsonSerializerAdapter;
private final JournalAPIInterceptor journalAPIInterceptor;
private final RequiredTokenInterceptor requiredTokenInterceptor;
private final EnableSettingInterceptor enableSettingInterceptor;
- private final RequestSingleParamResolver requestSingleParamResolver;
private final RequestRateLimitInterceptor requestRateLimitInterceptor;
private final RequiredFMCServerTokenInterceptor requiredFMCServerTokenInterceptor;
@@ -66,7 +61,7 @@ public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List argumentResolvers) {
- argumentResolvers.add(requestSingleParamResolver);
+ argumentResolvers.add(new RequestBodyValueArgumentResolver(jackson));
}
/**
@@ -76,22 +71,17 @@ public class WebConfig implements WebMvcConfigurer {
*/
@Override
public void configureMessageConverters(List> converters) {
- GsonHttpMessageConverter converter = new GsonHttpMessageConverter() {
-
- @Override
- protected void writeInternal(@NotNull Object object, Type type, @NonNull Writer writer) {
- // 忽略参数类型,因为接口返回对象会被全局返回处理器包装为 TimiResponse,否则会序列化转型错误
- getGson().toJson(object, writer);
- }
- };
-
- GsonBuilder builder = new GsonBuilder();
- builder.registerTypeAdapter(Attachment.class, gsonSerializerAdapter);
- builder.registerTypeAdapter(UserView.class, gsonSerializerAdapter);
- builder.registerTypeAdapter(MirrorView.class, gsonSerializerAdapter);
- builder.registerTypeAdapter(UserProfileView.class, gsonSerializerAdapter);
- builder.registerTypeAdapter(MinecraftPlayer.class, gsonSerializerAdapter);
- converter.setGson(builder.create());
+ JsonMapper jsonMapper = JsonMapper.builder()
+ // 设置默认属性包含规则:忽略 null 值
+ .serializationInclusion(JsonInclude.Include.NON_NULL)
+ // 日期格式化
+ .defaultDateFormat(Time.dateTime)
+ // 忽略不存在字段
+ .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+ // 启用默认视图包含
+ .enable(MapperFeature.DEFAULT_VIEW_INCLUSION).build();
+ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(jsonMapper);
+ converter.setDefaultCharset(StandardCharsets.UTF_8);
converters.add(converter);
}
}
diff --git a/src/main/java/com/imyeyu/api/modules/bill/controller/BillController.java b/src/main/java/com/imyeyu/api/modules/bill/controller/BillController.java
deleted file mode 100644
index d324d04..0000000
--- a/src/main/java/com/imyeyu/api/modules/bill/controller/BillController.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.imyeyu.api.modules.bill.controller;
-
-import jakarta.validation.Valid;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import com.imyeyu.java.bean.timi.TimiCode;
-import com.imyeyu.java.bean.timi.TimiException;
-import com.imyeyu.api.modules.bill.entity.Bill;
-import com.imyeyu.api.modules.bill.service.BillService;
-import com.imyeyu.api.modules.common.bean.SettingKey;
-import com.imyeyu.api.modules.common.service.SettingService;
-import com.imyeyu.spring.TimiSpring;
-import com.imyeyu.spring.annotation.AOPLog;
-import com.imyeyu.spring.annotation.RequestRateLimit;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * 收支帐单接口
- *
- * @author 夜雨
- * @since 2023-02-04 01:02
- */
-@Slf4j
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("/bill")
-public class BillController {
-
- private final BillService service;
- private final SettingService settingService;
-
- /**
- * 创建收支帐单
- *
- * @param bill 账单
- */
- @AOPLog
- @RequestRateLimit
- @PostMapping("/create")
- public void createREBill(@Valid @RequestBody Bill bill) {
- if (!settingService.getAsString(SettingKey.BILL_API_TOKEN).equals(TimiSpring.getToken())) {
- throw new TimiException(TimiCode.REQUEST_BAD).msgKey("token.illegal");
- }
- service.create(bill);
- }
-}
diff --git a/src/main/java/com/imyeyu/api/modules/bill/entity/Bill.java b/src/main/java/com/imyeyu/api/modules/bill/entity/Bill.java
deleted file mode 100644
index 3769ecd..0000000
--- a/src/main/java/com/imyeyu/api/modules/bill/entity/Bill.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.imyeyu.api.modules.bill.entity;
-
-import jakarta.validation.constraints.DecimalMin;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import com.imyeyu.spring.entity.Entity;
-
-/**
- * 收支账单
- *
- * @author 夜雨
- * @since 2022-03-29 11:28
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class Bill extends Entity {
-
- /**
- * 类型
- *
- * @author 夜雨
- * @since 2022-03-29 11:28
- */
- @Getter
- public enum Type {
-
- /** 收入 */
- REVENUE,
-
- /** 支出 */
- EXPENDITURE
- }
-
- /**
- * 收入类型
- *
- * @author 夜雨
- * @since 2022-03-29 11:28
- */
- @Getter
- public enum RevenueType {
-
- /** 工作 */
- WORK,
-
- /** 退款 */
- REFUND,
-
- /** 其他 */
- OTHER
- }
-
- /**
- * 支出类型
- *
- * @author 夜雨
- * @since 2022-03-29 11:28
- */
- @Getter
- public enum ExpenditureType {
-
- /** 饮食 */
- FOOD,
-
- /** 生活 */
- LIFE,
-
- /** 通信 */
- COMMUNICATION,
-
- /** 交通 */
- TRAFFIC,
-
- /** 娱乐 */
- GAME,
-
- /** 工作 */
- WORK,
-
- /** 服饰 */
- CLOTHES,
-
- /** 医疗 */
- HEALTH,
-
- /** 其他 */
- OTHER
- }
-
- /** 收入类型 */
- private RevenueType revenueType;
-
- /** 支出类型 */
- private ExpenditureType expenditureType;
-
- /** 描述 */
- @NotBlank(message = "bill.description.empty")
- private String description;
-
- /** 金额(未确保计算精度,放大了 100 倍) */
- @NotNull(message = "bill.decimal.empty")
- @DecimalMin(value = "0", message = "bill.decimal.limit")
- private Long decimal;
-
- /** 备注 */
- private String remarks;
-
- /** @return true 为收入账单 */
- public boolean isRevenue() {
- return revenueType != null;
- }
-
- /** @return true 为支出账单 */
- public boolean isExpenditure() {
- return expenditureType != null;
- }
-}
diff --git a/src/main/java/com/imyeyu/api/modules/bill/mapper/BillMapper.java b/src/main/java/com/imyeyu/api/modules/bill/mapper/BillMapper.java
deleted file mode 100644
index 780f9ca..0000000
--- a/src/main/java/com/imyeyu/api/modules/bill/mapper/BillMapper.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.imyeyu.api.modules.bill.mapper;
-
-import com.imyeyu.api.modules.bill.entity.Bill;
-import com.imyeyu.spring.mapper.BaseMapper;
-
-/**
- * 收支帐单表
- *
- * @author 夜雨
- * @since 2022-04-01 16:26
- */
-public interface BillMapper extends BaseMapper {
-}
diff --git a/src/main/java/com/imyeyu/api/modules/bill/service/BillService.java b/src/main/java/com/imyeyu/api/modules/bill/service/BillService.java
deleted file mode 100644
index 887ca96..0000000
--- a/src/main/java/com/imyeyu/api/modules/bill/service/BillService.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.imyeyu.api.modules.bill.service;
-
-import com.imyeyu.api.modules.bill.entity.Bill;
-import com.imyeyu.spring.service.CreatableService;
-
-/**
- * 收支帐单服务
- *
- * @author 夜雨
- * @since 2022-04-01 16:24
- */
-public interface BillService extends CreatableService {
-}
diff --git a/src/main/java/com/imyeyu/api/modules/bill/service/implement/BillServiceImplement.java b/src/main/java/com/imyeyu/api/modules/bill/service/implement/BillServiceImplement.java
deleted file mode 100644
index ce1af39..0000000
--- a/src/main/java/com/imyeyu/api/modules/bill/service/implement/BillServiceImplement.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.imyeyu.api.modules.bill.service.implement;
-
-import com.imyeyu.api.modules.bill.entity.Bill;
-import com.imyeyu.api.modules.bill.mapper.BillMapper;
-import com.imyeyu.api.modules.bill.service.BillService;
-import com.imyeyu.spring.mapper.BaseMapper;
-import com.imyeyu.spring.service.AbstractEntityService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-/**
- * 收支账单服务
- *
- * @author 夜雨
- * @since 2022-04-01 16:25
- */
-@Service
-@RequiredArgsConstructor
-public class BillServiceImplement extends AbstractEntityService implements BillService {
-
- private final BillMapper mapper;
-
- @Override
- protected BaseMapper mapper() {
- return mapper;
- }
-}
diff --git a/src/main/java/com/imyeyu/api/modules/blog/entity/Article.java b/src/main/java/com/imyeyu/api/modules/blog/entity/Article.java
index 77f15df..d47ba6c 100644
--- a/src/main/java/com/imyeyu/api/modules/blog/entity/Article.java
+++ b/src/main/java/com/imyeyu/api/modules/blog/entity/Article.java
@@ -1,6 +1,6 @@
package com.imyeyu.api.modules.blog.entity;
-import com.google.gson.JsonElement;
+import com.fasterxml.jackson.databind.JsonNode;
import com.imyeyu.api.modules.common.bean.CommentSupport;
import com.imyeyu.spring.entity.Destroyable;
import com.imyeyu.spring.entity.Entity;
@@ -48,7 +48,7 @@ public class Article extends Entity implements CommentSupport, Destroyable {
protected String data;
/** 扩展数据 */
- protected JsonElement extendData;
+ protected JsonNode extendData;
/** 阅读数量 */
protected int reads;
diff --git a/src/main/java/com/imyeyu/api/modules/common/controller/CommonController.java b/src/main/java/com/imyeyu/api/modules/common/controller/CommonController.java
index 416bc2d..526d22e 100644
--- a/src/main/java/com/imyeyu/api/modules/common/controller/CommonController.java
+++ b/src/main/java/com/imyeyu/api/modules/common/controller/CommonController.java
@@ -1,7 +1,7 @@
package com.imyeyu.api.modules.common.controller;
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.imyeyu.api.bean.CaptchaFrom;
import com.imyeyu.api.modules.common.bean.ImageType;
import com.imyeyu.api.modules.common.bean.SettingKey;
@@ -95,12 +95,28 @@ public class CommonController {
private final AttachmentService attachmentService;
private final ClipboardService clipboardService;
- private final Gson gson;
+ private final ObjectMapper jackson;
private final Yaml yaml;
private final GridFSBucket gridFSBucket;
private final CaptchaManager captchaManager;
private final ResourceHandler resourceHandler;
+ private String writeJson(Object value) {
+ try {
+ return jackson.writeValueAsString(value);
+ } catch (IOException e) {
+ throw new TimiException(TimiCode.ERROR, "write json error", e);
+ }
+ }
+
+ private Map readJsonMap(String value) {
+ try {
+ return jackson.readValue(value, new TypeReference<>() {});
+ } catch (IOException e) {
+ throw new TimiException(TimiCode.ERROR, "read json error", e);
+ }
+ }
+
@AOPLog
@RequestMapping("")
public String root() {
@@ -253,12 +269,12 @@ public class CommonController {
case JSON -> {
if (setting.getType() == Setting.Type.YAML) {
Map obj = yaml.load(setting.getValue());
- result = gson.toJson(obj);
+ result = writeJson(obj);
}
}
case YAML -> {
if (setting.getType() == Setting.Type.JSON) {
- Map obj = gson.fromJson(setting.getValue(), new TypeToken