为了账号安全,请及时绑定邮箱和手机立即绑定

乔克 json 绑定的问题

乔克 json 绑定的问题

开心每一天1111 2022-09-28 09:43:42
我有一个问题转换 postgresql jsonb 我创建了绑定,如教程中所述:jooq教程 另外请注意,我没有使用codegen在我的存储库中,我有以下代码Binding binding = new PostgresJSONGsonBinding(); Field<JsonElement> gsonObj =         DSL.field("gsonObj",SQLDataType.OTHER.asConvertedDataType(binding));并在方法中输入错误com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated array at line 1 column 42 path $.factories[1]有人可以帮助理解我做错了什么吗?是的,我看到了其他问题:jooq的问题
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

工作代码


public class PostgresJSONGsonBinding implements Binding<Object, JsonElement> {

    // Binding <T> = Object (unknown JDBC type), and <U> = JsonElement (user type)


    private static final Logger LOGGER = LoggerFactory.getLogger(PostgresJSONGsonBinding.class);


    // The converter does all the work

    @Override

    public Converter<Object, JsonElement> converter() {

        return new Converter<Object, JsonElement>() {


            //Convert a database object to a user object

            @Override

            public JsonElement from(Object t) {

                return t == null ? JsonNull.INSTANCE : new Gson().fromJson(t.toString(), JsonElement.class);

            }


            // Convert a user object to a database object

            @Override

            public Object to(JsonElement u) {

                return u == null || u == JsonNull.INSTANCE ? null : new Gson().toJson(u);

            }


            @Override

            public Class<Object> fromType() {

                return Object.class;

            }


            @Override

            public Class<JsonElement> toType() {

                return JsonElement.class;

            }

        };

    }


    // Rending a bind variable for the binding context's value and casting it to the json type

    @Override

    public void sql(BindingSQLContext<JsonElement> ctx) throws SQLException {

        // Depending on how you generate your SQL, you may need to explicitly distinguish

        // between jOOQ generating bind variables or inlined literals.

        if (ctx.render().paramType() == ParamType.INLINED){

            ctx.render().visit(DSL.inline(ctx.convert(converter()).value())).sql("::json");

        }

        else{

            ctx.render().sql("?::json");

        }

    }


    // Registering VARCHAR types for JDBC CallableStatement OUT parameters

    @Override

    public void register(BindingRegisterContext<JsonElement> ctx) throws SQLException {

        ctx.statement().registerOutParameter(ctx.index(), Types.VARCHAR);

    }


    // Converting the JsonElement to a String value and setting that on a JDBC PreparedStatement

    @Override

    public void set(BindingSetStatementContext<JsonElement> ctx) throws SQLException {

        ctx.statement().setString(ctx.index(), Objects.toString(ctx.convert(converter()).value(), null));

    }


    // Getting a String value from a JDBC ResultSet and converting that to a JsonElement

    @Override

    public void get(BindingGetResultSetContext<JsonElement> ctx) throws SQLException {

        ctx.convert(converter()).value(ctx.resultSet().getString(ctx.index()));

    }


    // Getting a String value from a JDBC CallableStatement and converting that to a JsonElement

    @Override

    public void get(BindingGetStatementContext<JsonElement> ctx) throws SQLException {

        ctx.convert(converter()).value(ctx.statement().getString(ctx.index()));

    }


    // Setting a value on a JDBC SQLOutput (useful for Oracle OBJECT types)

    @Override

    public void set(BindingSetSQLOutputContext<JsonElement> ctx) throws SQLException {

        throw new SQLFeatureNotSupportedException();

    }


    // Getting a value from a JDBC SQLInput (useful for Oracle OBJECT types)

    @Override

    public void get(BindingGetSQLInputContext<JsonElement> ctx) throws SQLException {

        throw new SQLFeatureNotSupportedException();

    }

}


查看完整回答
反对 回复 2022-09-28
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信