當前位置:
首頁 > 知識 > SpringMVC 和 MyBatis 支持 Jackson 的經驗談

SpringMVC 和 MyBatis 支持 Jackson 的經驗談

最近折騰了在 SpringMVC 直接傳入 JSON 和 MyBatis 讀出寫入 JSON 的功能。

首先簡單了解 Jackson 的類型系統:

  1. TreeNode 介面是根類型
  2. JsonNode 抽象類是 TreeNode 介面的直接實現,也是其他 Node 的基類
  3. 之上再分為 ValueNode 值節點和 ContainerNode 容器節點兩種
  4. 最後是廣為人知的 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應用-搭建