项目场景:
当前端传递的数据类型是json对象,后端想用string接收(无法预估数据类型)
问题描述:
如果用Object接收,会被自动解析为LinkedHashMap类型,导致存到数据库时候出错(数据库对应字段类型为longtext)
//java实体对应的字段
@ApiModelProperty("表单json")
@TableField(select = false)
private String formJson;
//前端传递的数据结构
{
"formJson": {
"key": "xxxx",
"widget": "100",
"hidden": false
}
}
错误信息:
Cause: java.sql.SQLException: Incorrect string value: ‘\xAC\xED\x00\x05sr…’ for column ‘form_json’ at row 1
; uncategorized SQLException; SQL state [HY000]; error code [1366]; Incorrect string value: ‘\xAC\xED\x00\x05sr…’ for column ‘form_json’ at row 1; nested exception is java.sql.SQLException: Incorrect string value: ‘\xAC\xED\x00\x05sr…’ for column ‘form_json’ at row 1
如果用String接收则直接无法读取数据
解决方案:
使用jackson的JsonDeserialize注解自定义反序列化处理逻辑
public static class JsonToStringDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException {
if (jsonParser == null) {
return null;
}
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
if (node == null) {
return null;
}
return node.toString();
}
}
在需要使用自定义反序列化的字段上加上注释
@JsonDeserialize(using = JsonToStringDeserializer.class)