From 0731bf2c2274e648409eb43cddeb53fee27a60ca Mon Sep 17 00:00:00 2001 From: ZhouXY108 Date: Sat, 7 Jun 2025 00:56:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor(gson):=20=E5=90=88=E5=B9=B6=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=20JSR-310=20=E7=B1=BB=E5=9E=8B=E9=80=82=E9=85=8D?= =?UTF-8?q?=E5=99=A8=E5=88=B0=20`JSR310TypeAdapters`=20=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 InstantTypeAdapter、LocalDateTimeTypeAdapter、LocalDateTypeAdapter 和 ZonedDateTimeTypeAdapter 合并到 JSR310TypeAdapters 类中 - 更新包结构,移动适配器到 adapter 子包 - 新增相关包的 javadoc --- .../commons/gson/InstantTypeAdapter.java | 52 ----- .../gson/LocalDateTimeTypeAdapter.java | 71 ------- .../commons/gson/LocalDateTypeAdapter.java | 71 ------- .../gson/ZonedDateTimeTypeAdapter.java | 71 ------- .../gson/adapter/JSR310TypeAdapters.java | 187 ++++++++++++++++++ .../commons/gson/adapter/package-info.java | 20 ++ .../plusone/commons/gson/package-info.java | 20 ++ .../JSR310TypeAdaptersTests.java} | 5 +- 8 files changed, 230 insertions(+), 267 deletions(-) delete mode 100644 plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/InstantTypeAdapter.java delete mode 100644 plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/LocalDateTimeTypeAdapter.java delete mode 100644 plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/LocalDateTypeAdapter.java delete mode 100644 plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/ZonedDateTimeTypeAdapter.java create mode 100644 plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/adapter/JSR310TypeAdapters.java create mode 100644 plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/adapter/package-info.java create mode 100644 plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/package-info.java rename plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/gson/{GsonTypeAdapterTests.java => adapter/JSR310TypeAdaptersTests.java} (97%) diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/InstantTypeAdapter.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/InstantTypeAdapter.java deleted file mode 100644 index 24e6fb3..0000000 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/InstantTypeAdapter.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package xyz.zhouxy.plusone.commons.gson; - -import java.io.IOException; -import java.time.Instant; -import java.time.format.DateTimeFormatter; - -import com.google.gson.TypeAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -/** - * {@code Instant} 的 {@code TypeAdapter}, - * 用于 Gson 对 {@code Instant} 进行相互转换。 - * - *

- * 使用 {@link DateTimeFormatter#ISO_INSTANT} 进行 {@link Instant} 的序列化与反序列化。 - *

- * - * @author ZhouXY - * @since 1.1.0 - * @see TypeAdapter - * @see com.google.gson.GsonBuilder - */ -public final class InstantTypeAdapter extends TypeAdapter { - - /** {@inheritDoc} */ - @Override - public void write(JsonWriter out, Instant value) throws IOException { - out.value(DateTimeFormatter.ISO_INSTANT.format(value)); - } - - /** {@inheritDoc} */ - @Override - public Instant read(JsonReader in) throws IOException { - return Instant.parse(in.nextString()); - } -} diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/LocalDateTimeTypeAdapter.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/LocalDateTimeTypeAdapter.java deleted file mode 100644 index 317f404..0000000 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/LocalDateTimeTypeAdapter.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package xyz.zhouxy.plusone.commons.gson; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -import com.google.gson.TypeAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -import xyz.zhouxy.plusone.commons.util.AssertTools; - -/** - * {@code LocalDateTime} 的 {@code TypeAdapter}, - * 用于 Gson 对 {@code LocalDateTime} 进行相互转换。 - * - * @author ZhouXY - * @since 1.1.0 - * @see TypeAdapter - * @see com.google.gson.GsonBuilder - */ -public class LocalDateTimeTypeAdapter extends TypeAdapter { - - private final DateTimeFormatter dateTimeFormatter; - - /** - * 默认构造函数, - * 使用 {@link DateTimeFormatter#ISO_LOCAL_DATE_TIME} 进行 {@link LocalDateTime} 的序列化与反序列化。 - */ - public LocalDateTimeTypeAdapter() { - this.dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; - } - - /** - * 构造函数, - * 使用传入的 {@link DateTimeFormatter} 进行 {@link LocalDateTime} 的序列化与反序列化。 - * - * @param formatter 用于序列化 {@link LocalDateTime} 的格式化器,不可为 {@code null}。 - */ - public LocalDateTimeTypeAdapter(DateTimeFormatter formatter) { - AssertTools.checkArgumentNotNull(formatter, "formatter can not be null."); - this.dateTimeFormatter = formatter; - } - - /** {@inheritDoc} */ - @Override - public void write(JsonWriter out, LocalDateTime value) throws IOException { - out.value(dateTimeFormatter.format(value)); - } - - /** {@inheritDoc} */ - @Override - public LocalDateTime read(JsonReader in) throws IOException { - return LocalDateTime.parse(in.nextString(), dateTimeFormatter); - } -} diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/LocalDateTypeAdapter.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/LocalDateTypeAdapter.java deleted file mode 100644 index 5a42ad3..0000000 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/LocalDateTypeAdapter.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package xyz.zhouxy.plusone.commons.gson; - -import java.io.IOException; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; - -import com.google.gson.TypeAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -import xyz.zhouxy.plusone.commons.util.AssertTools; - -/** - * {@code LocalDate} 的 {@code TypeAdapter}, - * 用于 Gson 对 {@code LocalDate} 进行相互转换。 - * - * @author ZhouXY - * @since 1.1.0 - * @see TypeAdapter - * @see com.google.gson.GsonBuilder - */ -public class LocalDateTypeAdapter extends TypeAdapter { - - private final DateTimeFormatter dateTimeFormatter; - - /** - * 默认构造函数, - * 使用 {@link DateTimeFormatter#ISO_LOCAL_DATE} 进行 {@link LocalDate} 的序列化与反序列化。 - */ - public LocalDateTypeAdapter() { - this.dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE; - } - - /** - * 构造函数, - * 使用传入的 {@link DateTimeFormatter} 进行 {@link LocalDate} 的序列化与反序列化。 - * - * @param formatter 用于序列化 {@link LocalDate} 的格式化器,不可为 {@code null}。 - */ - public LocalDateTypeAdapter(DateTimeFormatter formatter) { - AssertTools.checkArgumentNotNull(formatter, "formatter can not be null."); - this.dateTimeFormatter = formatter; - } - - /** {@inheritDoc} */ - @Override - public void write(JsonWriter out, LocalDate value) throws IOException { - out.value(dateTimeFormatter.format(value)); - } - - /** {@inheritDoc} */ - @Override - public LocalDate read(JsonReader in) throws IOException { - return LocalDate.parse(in.nextString(), dateTimeFormatter); - } -} diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/ZonedDateTimeTypeAdapter.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/ZonedDateTimeTypeAdapter.java deleted file mode 100644 index 7acd75e..0000000 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/ZonedDateTimeTypeAdapter.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package xyz.zhouxy.plusone.commons.gson; - -import java.io.IOException; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; - -import com.google.gson.TypeAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -import xyz.zhouxy.plusone.commons.util.AssertTools; - -/** - * {@code ZonedDateTime} 的 {@code TypeAdapter}, - * 用于 Gson 对 {@code ZonedDateTime} 进行相互转换。 - * - * @author ZhouXY - * @since 1.1.0 - * @see TypeAdapter - * @see com.google.gson.GsonBuilder - */ -public class ZonedDateTimeTypeAdapter extends TypeAdapter { - - private final DateTimeFormatter dateTimeFormatter; - - /** - * 默认构造函数, - * 使用 {@link DateTimeFormatter#ISO_ZONED_DATE_TIME} 进行 {@link ZonedDateTime} 的序列化与反序列化。 - */ - public ZonedDateTimeTypeAdapter() { - this.dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME; - } - - /** - * 构造函数, - * 使用传入的 {@link DateTimeFormatter} 进行 {@link ZonedDateTime} 的序列化与反序列化。 - * - * @param formatter 用于序列化 {@link ZonedDateTime} 的格式化器,不可为 {@code null}。 - */ - public ZonedDateTimeTypeAdapter(DateTimeFormatter formatter) { - AssertTools.checkArgumentNotNull(formatter, "formatter can not be null."); - this.dateTimeFormatter = formatter; - } - - /** {@inheritDoc} */ - @Override - public void write(JsonWriter out, ZonedDateTime value) throws IOException { - out.value(dateTimeFormatter.format(value)); - } - - /** {@inheritDoc} */ - @Override - public ZonedDateTime read(JsonReader in) throws IOException { - return ZonedDateTime.parse(in.nextString(), dateTimeFormatter); - } -} diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/adapter/JSR310TypeAdapters.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/adapter/JSR310TypeAdapters.java new file mode 100644 index 0000000..6130c95 --- /dev/null +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/adapter/JSR310TypeAdapters.java @@ -0,0 +1,187 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package xyz.zhouxy.plusone.commons.gson.adapter; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +import xyz.zhouxy.plusone.commons.util.AssertTools; + +/** + * 包含 JSR-310 相关数据类型的 {@code TypeAdapter} + * + * @author ZhouXY + * @since 1.1.0 + * @see TypeAdapter + * @see com.google.gson.GsonBuilder + */ +public class JSR310TypeAdapters { + + /** + * {@code LocalDate} 的 {@code TypeAdapter}, + * 用于 Gson 对 {@code LocalDate} 进行相互转换。 + */ + public static final class LocalDateTypeAdapter extends TypeAdapter { + + private final DateTimeFormatter dateTimeFormatter; + + /** + * 默认构造函数, + * 使用 {@link DateTimeFormatter#ISO_LOCAL_DATE} 进行 {@link LocalDate} 的序列化与反序列化。 + */ + public LocalDateTypeAdapter() { + this.dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE; + } + + /** + * 构造函数, + * 使用传入的 {@link DateTimeFormatter} 进行 {@link LocalDate} 的序列化与反序列化。 + * + * @param formatter 用于序列化 {@link LocalDate} 的格式化器,不可为 {@code null}。 + */ + public LocalDateTypeAdapter(DateTimeFormatter formatter) { + AssertTools.checkArgumentNotNull(formatter, "formatter can not be null."); + this.dateTimeFormatter = formatter; + } + + /** {@inheritDoc} */ + @Override + public void write(JsonWriter out, LocalDate value) throws IOException { + out.value(dateTimeFormatter.format(value)); + } + + /** {@inheritDoc} */ + @Override + public LocalDate read(JsonReader in) throws IOException { + return LocalDate.parse(in.nextString(), dateTimeFormatter); + } + } + + /** + * {@code LocalDateTime} 的 {@code TypeAdapter}, + * 用于 Gson 对 {@code LocalDateTime} 进行相互转换。 + */ + public static final class LocalDateTimeTypeAdapter extends TypeAdapter { + + private final DateTimeFormatter dateTimeFormatter; + + /** + * 默认构造函数, + * 使用 {@link DateTimeFormatter#ISO_LOCAL_DATE_TIME} 进行 {@link LocalDateTime} 的序列化与反序列化。 + */ + public LocalDateTimeTypeAdapter() { + this.dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + } + + /** + * 构造函数, + * 使用传入的 {@link DateTimeFormatter} 进行 {@link LocalDateTime} 的序列化与反序列化。 + * + * @param formatter 用于序列化 {@link LocalDateTime} 的格式化器,不可为 {@code null}。 + */ + public LocalDateTimeTypeAdapter(DateTimeFormatter formatter) { + AssertTools.checkArgumentNotNull(formatter, "formatter can not be null."); + this.dateTimeFormatter = formatter; + } + + /** {@inheritDoc} */ + @Override + public void write(JsonWriter out, LocalDateTime value) throws IOException { + out.value(dateTimeFormatter.format(value)); + } + + /** {@inheritDoc} */ + @Override + public LocalDateTime read(JsonReader in) throws IOException { + return LocalDateTime.parse(in.nextString(), dateTimeFormatter); + } + } + + /** + * {@code ZonedDateTime} 的 {@code TypeAdapter}, + * 用于 Gson 对 {@code ZonedDateTime} 进行相互转换。 + */ + public static final class ZonedDateTimeTypeAdapter extends TypeAdapter { + + private final DateTimeFormatter dateTimeFormatter; + + /** + * 默认构造函数, + * 使用 {@link DateTimeFormatter#ISO_ZONED_DATE_TIME} 进行 {@link ZonedDateTime} 的序列化与反序列化。 + */ + public ZonedDateTimeTypeAdapter() { + this.dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME; + } + + /** + * 构造函数, + * 使用传入的 {@link DateTimeFormatter} 进行 {@link ZonedDateTime} 的序列化与反序列化。 + * + * @param formatter 用于序列化 {@link ZonedDateTime} 的格式化器,不可为 {@code null}。 + */ + public ZonedDateTimeTypeAdapter(DateTimeFormatter formatter) { + AssertTools.checkArgumentNotNull(formatter, "formatter can not be null."); + this.dateTimeFormatter = formatter; + } + + /** {@inheritDoc} */ + @Override + public void write(JsonWriter out, ZonedDateTime value) throws IOException { + out.value(dateTimeFormatter.format(value)); + } + + /** {@inheritDoc} */ + @Override + public ZonedDateTime read(JsonReader in) throws IOException { + return ZonedDateTime.parse(in.nextString(), dateTimeFormatter); + } + } + + /** + * {@code Instant} 的 {@code TypeAdapter}, + * 用于 Gson 对 {@code Instant} 进行相互转换。 + * + *

+ * 使用 {@link DateTimeFormatter#ISO_INSTANT} 进行 {@link Instant} 的序列化与反序列化。 + *

+ */ + public static final class InstantTypeAdapter extends TypeAdapter { + + /** {@inheritDoc} */ + @Override + public void write(JsonWriter out, Instant value) throws IOException { + out.value(DateTimeFormatter.ISO_INSTANT.format(value)); + } + + /** {@inheritDoc} */ + @Override + public Instant read(JsonReader in) throws IOException { + return Instant.parse(in.nextString()); + } + } + + private JSR310TypeAdapters() { + throw new IllegalStateException("Utility class"); + } +} diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/adapter/package-info.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/adapter/package-info.java new file mode 100644 index 0000000..00356dd --- /dev/null +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/adapter/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Gson 相关类型适配器 + */ +package xyz.zhouxy.plusone.commons.gson.adapter; diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/package-info.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/package-info.java new file mode 100644 index 0000000..221b760 --- /dev/null +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/gson/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Gson 相关辅助工具 + */ +package xyz.zhouxy.plusone.commons.gson; diff --git a/plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/gson/GsonTypeAdapterTests.java b/plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/gson/adapter/JSR310TypeAdaptersTests.java similarity index 97% rename from plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/gson/GsonTypeAdapterTests.java rename to plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/gson/adapter/JSR310TypeAdaptersTests.java index b00f5da..c9cb1f8 100644 --- a/plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/gson/GsonTypeAdapterTests.java +++ b/plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/gson/adapter/JSR310TypeAdaptersTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package xyz.zhouxy.plusone.commons.gson; +package xyz.zhouxy.plusone.commons.gson.adapter; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -33,9 +33,10 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import lombok.extern.slf4j.Slf4j; +import xyz.zhouxy.plusone.commons.gson.adapter.JSR310TypeAdapters.*; @Slf4j -public class GsonTypeAdapterTests { +public final class JSR310TypeAdaptersTests { final Gson gsonWithDefaultFormatter = new GsonBuilder() .registerTypeAdapter(LocalDate.class, new LocalDateTypeAdapter().nullSafe())