根据错误信息: ``` Caused by: org.postgresql.util.PSQLException: ERROR: column "key_value" is of type json but expression is of type character varying ``` 这个问题表明在 PostgreSQL 数据库中,`key_value` 字段的类型是 `json`(或 `jsonb`),但是你尝试将一个字符串类型的数据(`character varying`)插入到 `json` 类型的字段中,导致了类型不匹配。 ### 解决方案 1. **确保插入的数据是有效的 JSON 格式** PostgreSQL 中的 `json` 类型要求存储的数据必须是有效的 JSON 格式。因此,你需要确保将正确的 JSON 数据传递给数据库。 2. **修改 `FastjsonTypeHandler` 以确保将数据正确转换为 JSON 格式** 在 `FastjsonTypeHandler` 中,我们需要将 `JSONObject` 转换为有效的 JSON 字符串,而不是普通的字符串。你已经使用了 `JSONObject.toJSONString()`,但是你需要确保它插入到数据库时与 `json` 类型字段匹配。 ### 修改 `FastjsonTypeHandler` 确保 `FastjsonTypeHandler` 中 `setNonNullParameter` 方法将数据以有效的 JSON 格式存储到数据库中,而不是单纯的字符串。 ```java import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import com.alibaba.fastjson.JSONObject; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class FastjsonTypeHandler extends BaseTypeHandler { /** * 设置非空的参数,将 JSONObject 转为 JSON 格式字符串,并设置到 PreparedStatement 中。 */ @Override public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException { if (parameter != null) { // 将 JSONObject 转为 JSON 格式字符串 ps.setObject(i, parameter.toJSONString(), JdbcType.OTHER.TYPE_CODE); } else { ps.setNull(i, JdbcType.OTHER.TYPE_CODE); } } /** * 从 ResultSet 获取字段值并转换为 JSONObject */ @Override public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException { String jsonString = rs.getString(columnName); return jsonString == null ? null : JSONObject.parseObject(jsonString); } /** * 从 ResultSet 获取字段值并转换为 JSONObject */ @Override public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String jsonString = rs.getString(columnIndex); return jsonString == null ? null : JSONObject.parseObject(jsonString); } /** * 从 CallableStatement 获取字段值并转换为 JSONObject */ @Override public JSONObject getNullableResult(java.sql.CallableStatement cs, int columnIndex) throws SQLException { String jsonString = cs.getString(columnIndex); return jsonString == null ? null : JSONObject.parseObject(jsonString); } } ``` ### 配置 PostgreSQL 数据库 确保 PostgreSQL 中的 `key_value` 字段的类型是 `json` 或 `jsonb`,并且这个字段能够接受正确的 JSON 格式的数据。 ```sql CREATE TABLE your_table ( id SERIAL PRIMARY KEY, key_value JSON -- 使用 json 或 jsonb 类型 ); ``` ### 确保传递有效的 JSON 数据 插入数据时,确保传递的是一个有效的 JSON 格式数据(比如 `JSONObject`)。通过 `toJSONString()` 方法,Fastjson 会确保将 `JSONObject` 转换为 JSON 格式的字符串,而不是普通的字符型字符串。 ### 总结 - **问题**:`key_value` 字段在数据库中是 `json` 类型,而你尝试插入一个普通的字符串,这会导致类型不匹配。 - **解决方案**:确保你将 `JSONObject` 转换为 JSON 字符串,并且在 MyBatis 的类型处理器中使用 `setObject` 方法将其以正确的类型插入数据库。 - **修改 `FastjsonTypeHandler`**:在 `setNonNullParameter` 方法中,使用 `ps.setObject(i, parameter.toJSONString(), JdbcType.OTHER.TYPE_CODE)` 来确保数据以正确的类型插入。 这样,插入的数据就会以 JSON 格式存储到 PostgreSQL 数据库的 `json` 类型字段中。如果还有问题,可以继续询问!