SpringMVC 和 MyBatis 支持 Jackson 的經驗談
最近折騰了在 SpringMVC 直接傳入 JSON 和 MyBatis 讀出寫入 JSON 的功能。
首先簡單了解 Jackson 的類型系統:
- TreeNode 介面是根類型
- JsonNode 抽象類是 TreeNode 介面的直接實現,也是其他 Node 的基類
- 之上再分為 ValueNode 值節點和 ContainerNode 容器節點兩種
- 最後是廣為人知的 BooleanNode / StringNode / ArrayNode / ObjectNode 等節點
本文綜述只有一句話:使用抽象基類,不要使用介面類型。
SpringMVC 里 Controller 中路由映射的方法的參數列表,可以配置 @RequestBody
註解,使某個參數來自解析後的 HTTP 的 body 內容,我們稱之為 官網:www.fhadmin.org Form。Form 中需要使用 JsonNode 而不是 TreeNode。
HTTP 請求樣例
{
"id": "1",
"custom": {
"key": "value"
}
}
Form 類
@Data
public classMyForm{
private String id;
private JsonNode custom;
}
本文默認使用自動生成代碼的 lombok 包,@Data
和@RequiredArgsConstructor
都出自該包。
路由映射的方法
@RestController
public classMyController{
@PostMapping("/my")
public Object myMethod(@RequestBody MyForm form){
...
}
}
如果我們希望從 MyBatis 官網:www.fhadmin.org 中正確讀出寫入,也要用 JsonNode 而不是 TreeNode。
@Data
public classUser{
private String id;
private JsonNode custom;
}
需要實現 JsonNodeTypeHandler 並註冊到 MyBatis 的 SqlSessionFactory
import java.io.*;
import java.sql.*;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@MappedTypes(JsonNode.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public classJsonNodeTypeHandlerextendsBaseTypeHandler<JsonNode> {
private final ObjectMapper objectMapper;
@Override 官網:www.fhadmin.org
publicvoidsetNonNullParameter(PreparedStatement ps, int i, JsonNode parameter, JdbcType jdbcType)throws SQLException {
String json = parameter.toString;
ps.setString(i, json);
}
private JsonNode read(String json){
try {
return objectMapper.readTree(json);
} catch (JsonParseException e) {
if (LOG.isWarnEnabled) {
LOG.warn("JSON parse failed", e);
}
return null;
} catch (IOException e) {
// should not occur, no real i/o...
throw new IllegalArgumentException(e.getMessage, e);
}
}
@Override
public JsonNode getNullableResult(ResultSet rs, String columnName)throws SQLException {
String json = rs.getString(columnName);
return read(json);
}
@Override
public JsonNode getNullableResult(ResultSet rs, int columnIndex)throws SQLException {
String json = rs.getString(columnIndex);
return read(json);
}
@Override
public JsonNode getNullableResult(CallableStatement cs, int columnIndex)throws SQLException {
String json = cs.getString(columnIndex);
return read(json);
}
}
List<TypeHandler> typeHandlers = ...;
typeHandlers.add(new JsonNodeTypeHandler(objectMapper));
sqlSessionFactory.setTypeHandlers(typeHandlers.toArray(new TypeHandler[typeHandlers.size()]));
這樣就大功告成了。
※Mastering KVM Virtualization>:第二章 KVM內部原理
※搭建hadoop、hdfs環境——ubuntu
※ASP.NET Core 源碼學習之 Logging[4]:FileProvider
※HTML <img>標籤 創建圖像映射
※C 6.0 內插字元串 (Interpolated Strings)
TAG:科技優家 |
※Spring4+hibernate+SpringMvc整合
※淺談SpringMVC和MyBatis在應用方面的優勢
※SpringMVC,Spring,Hibernate框架自動生成器
※SpringMVC + security模塊 框架整合詳解
※netty整合springMVC,實現高效的HTTP服務請求
※Spring SpringMVC配置Druid數據源(資料庫連接池)
※Spring與SpringMVC的容器關係分析
※SpringMVC如何與Servlet3整合在一起
※前端基於angular6的ionic3,後端基於springmvc post get請求實現
※SpringMVC工程的web.xml以及其他配置文件
※springmvc+jsp轉spring boot結構 前後端分離
※搭建SpringMVC(非web.xml文件方式)
※springmvc原理詳解(手寫springmvc)
※SpringMVC接收Form表單中的數組數據
※SpringMVC(輕量級Web框架)
※SpringMVC流程架構
※如何修改request參數值並應用到springMvc中
※SpringMVC 開發 — 使用 Swagger 搭建介面請求頁面
※ajax傳遞參數給springmvc總結「轉」
※免xml配置springmvc應用-搭建