From fbab3df307e5d75eef97d7f363b4d918285a4311 Mon Sep 17 00:00:00 2001 From: gyl <1554863190@qq.com> Date: Tue, 26 May 2026 16:23:05 +0800 Subject: [PATCH] =?UTF-8?q?refactor(PostgreSQL):=20=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E7=B1=BB=E5=9E=8B=E5=88=A4=E6=96=AD=E5=B7=A5?= =?UTF-8?q?=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../json/JdbcPostgresqlJsonStringReader.java | 9 ++++-- .../json/R2dbcPostgresqlJsonStringReader.java | 8 +++-- .../postgres/PostgresqlArrayType.java | 2 +- .../postgres/PostgresqlDriverUtils.java | 29 +++++++++++++++++++ .../rdb/supports/postgres/VectorType.java | 7 ++--- .../supports/json/JsonCodecSupportTest.java | 21 ++++++++++++++ 6 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/PostgresqlDriverUtils.java diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/json/JdbcPostgresqlJsonStringReader.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/json/JdbcPostgresqlJsonStringReader.java index fc9e12e2..6f9eeda0 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/json/JdbcPostgresqlJsonStringReader.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/json/JdbcPostgresqlJsonStringReader.java @@ -1,5 +1,6 @@ package org.hswebframework.ezorm.rdb.supports.json; +import org.hswebframework.ezorm.rdb.supports.postgres.PostgresqlDriverUtils; import org.postgresql.util.PGobject; /** @@ -9,12 +10,14 @@ public class JdbcPostgresqlJsonStringReader implements JsonStringReader { @Override public boolean supports(Object data) { - return data instanceof PGobject; + return PostgresqlDriverUtils.isPgObject(data) && data instanceof PGobject; } @Override public String read(Object data) { - String value = ((PGobject) data).getValue(); - return value == null ? null : String.valueOf(value); + if (PostgresqlDriverUtils.isPgObject(data) && data instanceof PGobject) { + return ((PGobject) data).getValue(); + } + return null; } } diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/json/R2dbcPostgresqlJsonStringReader.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/json/R2dbcPostgresqlJsonStringReader.java index 3834a8f2..a3c761b5 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/json/R2dbcPostgresqlJsonStringReader.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/json/R2dbcPostgresqlJsonStringReader.java @@ -1,6 +1,7 @@ package org.hswebframework.ezorm.rdb.supports.json; import io.r2dbc.postgresql.codec.Json; +import org.hswebframework.ezorm.rdb.supports.postgres.PostgresqlDriverUtils; /** * Reads JSON values returned by PostgreSQL R2DBC. @@ -9,11 +10,14 @@ public class R2dbcPostgresqlJsonStringReader implements JsonStringReader { @Override public boolean supports(Object data) { - return data instanceof Json; + return PostgresqlDriverUtils.isR2dbcJson(data) && data instanceof Json; } @Override public String read(Object data) { - return ((Json) data).asString(); + if (PostgresqlDriverUtils.isR2dbcJson(data) && data instanceof Json) { + return ((Json) data).asString(); + } + return null; } } diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/PostgresqlArrayType.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/PostgresqlArrayType.java index 4c254bb4..9c0fce78 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/PostgresqlArrayType.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/PostgresqlArrayType.java @@ -84,7 +84,7 @@ private Object convert(Object value) { if (value instanceof java.sql.Array sqlArray) { return convertSqlArray(sqlArray); } - if (value instanceof PGobject pgObject) { + if (PostgresqlDriverUtils.isPgObject(value) && value instanceof PGobject pgObject) { return convert(pgObject.getValue()); } if (value instanceof Collection collection) { diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/PostgresqlDriverUtils.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/PostgresqlDriverUtils.java new file mode 100644 index 00000000..146beab8 --- /dev/null +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/PostgresqlDriverUtils.java @@ -0,0 +1,29 @@ +package org.hswebframework.ezorm.rdb.supports.postgres; + +public final class PostgresqlDriverUtils { + + private static final String PG_OBJECT_CLASS = "org.postgresql.util.PGobject"; + + private static final String R2DBC_JSON_CLASS = "io.r2dbc.postgresql.codec.Json"; + + private static final String R2DBC_VECTOR_CLASS = "io.r2dbc.postgresql.codec.Vector"; + + private PostgresqlDriverUtils() { + } + + public static boolean isPgObject(Object value) { + return isExactClass(value, PG_OBJECT_CLASS); + } + + public static boolean isR2dbcJson(Object value) { + return isExactClass(value, R2DBC_JSON_CLASS); + } + + public static boolean isR2dbcVector(Object value) { + return isExactClass(value, R2DBC_VECTOR_CLASS); + } + + private static boolean isExactClass(Object value, String className) { + return value != null && className.equals(value.getClass().getName()); + } +} diff --git a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/VectorType.java b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/VectorType.java index dbbe2b98..8c74b9f6 100644 --- a/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/VectorType.java +++ b/hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/supports/postgres/VectorType.java @@ -61,17 +61,14 @@ public Object decode(Object data) { return toFloat(data); } - private static final String PG_OBJECT_CLASS = "org.postgresql.util.PGobject"; - private static final String R2DBC_PG_OBJECT_CLASS = "io.r2dbc.postgresql.codec.Vector"; - private Float[] toFloat(Object data) { if (data == null) { return null; } - if (R2DBC_PG_OBJECT_CLASS.equals(data.getClass().getName()) && data instanceof Vector vector) { + if (PostgresqlDriverUtils.isR2dbcVector(data) && data instanceof Vector vector) { return toFloatArray(vector.getVector()); } - if (PG_OBJECT_CLASS.equals(data.getClass().getName()) && data instanceof PGobject vector) { + if (PostgresqlDriverUtils.isPgObject(data) && data instanceof PGobject vector) { return toFloatArray(vector.getValue()); } return toFloatArray(data); diff --git a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/json/JsonCodecSupportTest.java b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/json/JsonCodecSupportTest.java index 45c9acb0..48fe6247 100644 --- a/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/json/JsonCodecSupportTest.java +++ b/hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/json/JsonCodecSupportTest.java @@ -2,6 +2,7 @@ import org.junit.Assert; import org.junit.Test; +import org.postgresql.util.PGobject; public class JsonCodecSupportTest { @@ -30,6 +31,19 @@ public String read(Object data) { Assert.assertEquals("ok", JsonCodecSupport.readAsString(new SampleJson("ok"))); } + @Test + public void testJdbcPostgresqlJsonReader() throws Exception { + PGobject pgObject = new PGobject(); + pgObject.setType("jsonb"); + pgObject.setValue("{\"id\":\"test\"}"); + + JsonStringReader reader = new JdbcPostgresqlJsonStringReader(); + Assert.assertTrue(reader.supports(pgObject)); + Assert.assertEquals("{\"id\":\"test\"}", reader.read(pgObject)); + Assert.assertFalse(reader.supports(new SamplePgObject("{\"id\":\"test\"}"))); + Assert.assertNull(reader.read(new SamplePgObject("{\"id\":\"test\"}"))); + } + private static class SampleJson { private final String value; @@ -37,4 +51,11 @@ private SampleJson(String value) { this.value = value; } } + + private static class SamplePgObject extends PGobject { + + private SamplePgObject(String value) throws Exception { + setValue(value); + } + } }