Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.hswebframework.ezorm.rdb.supports.json;

import org.hswebframework.ezorm.rdb.supports.postgres.PostgresqlDriverUtils;
import org.postgresql.util.PGobject;

/**
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.junit.Assert;
import org.junit.Test;
import org.postgresql.util.PGobject;

public class JsonCodecSupportTest {

Expand Down Expand Up @@ -30,11 +31,31 @@ 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;

private SampleJson(String value) {
this.value = value;
}
}

private static class SamplePgObject extends PGobject {

private SamplePgObject(String value) throws Exception {
setValue(value);
}
}
}
Loading