From a13795703eb338102953e342818cada0af464e68 Mon Sep 17 00:00:00 2001 From: Timi Date: Mon, 16 Mar 2026 17:14:18 +0800 Subject: [PATCH] v0.0.4 --- pom.xml | 5 -- .../spring/annotation/RequestSingleParam.java | 22 ------ .../RequestSingleParamResolver.java | 67 ------------------- .../imyeyu/spring/handler/GsonHandler.java | 57 ---------------- .../spring/handler/JsonNodeTypeHandler.java | 62 +++++++++++++++++ .../imyeyu/spring/util/RedisSerializers.java | 22 ++++-- 6 files changed, 78 insertions(+), 157 deletions(-) delete mode 100644 src/main/java/com/imyeyu/spring/annotation/RequestSingleParam.java delete mode 100644 src/main/java/com/imyeyu/spring/annotation/RequestSingleParamResolver.java delete mode 100644 src/main/java/com/imyeyu/spring/handler/GsonHandler.java create mode 100644 src/main/java/com/imyeyu/spring/handler/JsonNodeTypeHandler.java diff --git a/pom.xml b/pom.xml index 9c47bd3..e60d095 100644 --- a/pom.xml +++ b/pom.xml @@ -152,11 +152,6 @@ commons-pool2 2.12.0 - - com.google.code.gson - gson - 2.10.1 - com.imyeyu.io timi-io diff --git a/src/main/java/com/imyeyu/spring/annotation/RequestSingleParam.java b/src/main/java/com/imyeyu/spring/annotation/RequestSingleParam.java deleted file mode 100644 index 86364cb..0000000 --- a/src/main/java/com/imyeyu/spring/annotation/RequestSingleParam.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.imyeyu.spring.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 单字段 Json 数据体 - * - * @author 夜雨 - * @version 2023-08-09 10:36 - * @deprecated 0.0.3 过时,0.0.5 移除,单参数建议 url 传参 - */ -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Deprecated -public @interface RequestSingleParam { - -} diff --git a/src/main/java/com/imyeyu/spring/annotation/RequestSingleParamResolver.java b/src/main/java/com/imyeyu/spring/annotation/RequestSingleParamResolver.java deleted file mode 100644 index f254298..0000000 --- a/src/main/java/com/imyeyu/spring/annotation/RequestSingleParamResolver.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.imyeyu.spring.annotation; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import jakarta.annotation.Nonnull; -import jakarta.servlet.http.HttpServletRequest; -import com.imyeyu.io.IO; -import com.imyeyu.java.bean.timi.TimiCode; -import com.imyeyu.java.bean.timi.TimiException; -import org.springframework.core.MethodParameter; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.support.WebDataBinderFactory; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.method.support.ModelAndViewContainer; - -/** - * 单参数请求解析器 - * - * @author 夜雨 - * @since 2025-10-13 16:29 - * @deprecated 0.0.3 过时,0.0.5 移除,单参数建议 url 传参 - */ -@Component -@Deprecated -public class RequestSingleParamResolver implements HandlerMethodArgumentResolver { - - /** - * 创建单参数解析器 - */ - public RequestSingleParamResolver() { - } - - @Override - public boolean supportsParameter(MethodParameter parameter) { - return parameter.hasParameterAnnotation(RequestSingleParam.class); - } - - @Override - public Object resolveArgument(@Nonnull MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { - HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); - if (request == null) { - throw new TimiException(TimiCode.REQUEST_BAD, "request illegal"); - } - JsonElement element = JsonParser.parseString(IO.toString(request.getInputStream())); - if (!element.isJsonObject()) { - throw new TimiException(TimiCode.ARG_BAD, "not json object"); - } - JsonObject object = element.getAsJsonObject(); - String parameterName = parameter.getParameterName(); - if (!object.has(parameterName)) { - throw new TimiException(TimiCode.ARG_MISS, "not found " + parameterName + " param"); - } - JsonElement el = object.get(parameterName); - if (parameter.getParameterType().isAssignableFrom(Long.class)) { - return el.getAsLong(); - } - if (parameter.getParameterType().isAssignableFrom(Integer.class)) { - return el.getAsInt(); - } - if (parameter.getParameterType().isAssignableFrom(String.class)) { - return el.getAsString(); - } - throw new TimiException(TimiCode.ERROR, "not support parameter type"); - } -} diff --git a/src/main/java/com/imyeyu/spring/handler/GsonHandler.java b/src/main/java/com/imyeyu/spring/handler/GsonHandler.java deleted file mode 100644 index 2260f53..0000000 --- a/src/main/java/com/imyeyu/spring/handler/GsonHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.imyeyu.spring.handler; - -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; -import com.imyeyu.java.TimiJava; -import org.apache.ibatis.type.BaseTypeHandler; -import org.apache.ibatis.type.JdbcType; - -import java.sql.CallableStatement; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -/** - * MySQL JSON 数据类型处理器 - * - * @author 夜雨 - * @since 2021-07-04 09:36 - */ -public class GsonHandler extends BaseTypeHandler { - - @Override - public void setNonNullParameter(PreparedStatement ps, int i, JsonElement parameter, JdbcType jdbcType) throws SQLException { - ps.setString(i, parameter.toString()); - } - - @Override - public JsonElement getNullableResult(ResultSet rs, String columnName) throws SQLException { - return toElement(rs.getString(columnName)); - } - - @Override - public JsonElement getNullableResult(ResultSet rs, int columnIndex) throws SQLException { - return toElement(rs.getString(columnIndex)); - } - - @Override - public JsonElement getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { - return toElement(cs.getNString(columnIndex)); - } - - private JsonElement toElement(String json) { - if (TimiJava.isNotEmpty(json)) { - JsonElement el = JsonParser.parseString(json); - if (el.isJsonObject()) { - return el.getAsJsonObject(); - } - if (el.isJsonArray()) { - return el.getAsJsonArray(); - } - if (el.isJsonPrimitive()) { - return el.getAsJsonPrimitive(); - } - } - return null; - } -} diff --git a/src/main/java/com/imyeyu/spring/handler/JsonNodeTypeHandler.java b/src/main/java/com/imyeyu/spring/handler/JsonNodeTypeHandler.java new file mode 100644 index 0000000..a50f5c6 --- /dev/null +++ b/src/main/java/com/imyeyu/spring/handler/JsonNodeTypeHandler.java @@ -0,0 +1,62 @@ +package com.imyeyu.spring.handler; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * + * + * @author 夜雨 + * @since 2026-03-16 15:42 + */ +@MappedTypes(JsonNode.class) +@MappedJdbcTypes({JdbcType.VARCHAR, JdbcType.CLOB, JdbcType.LONGVARCHAR}) +public class JsonNodeTypeHandler extends BaseTypeHandler { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, JsonNode parameter, JdbcType jdbcType) throws SQLException { + try { + ps.setString(i, MAPPER.writeValueAsString(parameter)); + } catch (JsonProcessingException e) { + throw new SQLException("Failed to serialize JsonNode to JSON", e); + } + } + + @Override + public JsonNode getNullableResult(ResultSet rs, String columnName) throws SQLException { + return parseJson(rs.getString(columnName)); + } + + @Override + public JsonNode getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return parseJson(rs.getString(columnIndex)); + } + + @Override + public JsonNode getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return parseJson(cs.getString(columnIndex)); + } + + private JsonNode parseJson(String json) throws SQLException { + if (json == null || json.isEmpty()) { + return MAPPER.createObjectNode(); + } + try { + return MAPPER.readTree(json); + } catch (JsonProcessingException e) { + throw new SQLException("Failed to parse JSON to JsonNode", e); + } + } +} diff --git a/src/main/java/com/imyeyu/spring/util/RedisSerializers.java b/src/main/java/com/imyeyu/spring/util/RedisSerializers.java index 73015b7..bb157ed 100644 --- a/src/main/java/com/imyeyu/spring/util/RedisSerializers.java +++ b/src/main/java/com/imyeyu/spring/util/RedisSerializers.java @@ -1,10 +1,12 @@ package com.imyeyu.spring.util; -import com.google.gson.Gson; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import org.springframework.data.redis.serializer.StringRedisSerializer; +import java.io.IOException; import java.nio.charset.StandardCharsets; /** @@ -83,20 +85,24 @@ public class RedisSerializers { }; /** - * Gson 序列化 + * Json 序列化 * * @param 数据类型 * @param clazz 数据类型 * @return Redis 序列化器 */ - public static RedisSerializer gsonSerializer(Class clazz) { + public static RedisSerializer jacksonSerializer(Class clazz) { return new RedisSerializer<>() { - private static final Gson GSON = new Gson(); + private static final ObjectMapper JACKSON = new ObjectMapper(); @Override public byte[] serialize(T object) throws SerializationException { - return GSON.toJson(object).getBytes(StandardCharsets.UTF_8); + try { + return JACKSON.writeValueAsString(object).getBytes(StandardCharsets.UTF_8); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } } @Override @@ -104,7 +110,11 @@ public class RedisSerializers { if (bytes == null) { return null; } - return GSON.fromJson(new String(bytes, StandardCharsets.UTF_8), clazz); + try { + return JACKSON.readValue(new String(bytes, StandardCharsets.UTF_8), clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } } }; }