前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" ,然后使用 jackson @ResponseBody 返回前端报错。 转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9708485.html
后台报错:
26-Sep-2018 22:18:08.209 WARNING [http-apr-8080-exec-8] org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["pageData"]->java.util.ArrayList[2]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"])
表字段(oracle):
sql (mybatis):
原因:
经测试,oracle 数据库字段为 Data 型的并不会报错,只有 timestamp 类型会报错。
从后台报错日志中发现(through reference chain: java.util.HashMap["pageData"]->java.util.ArrayList[2]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"]) ,
然后发现返回的 map 里面 update_time 字段为 oracle.sql.TIMESTAMP 类型,并不是 java.sql.Timestamp,所以 json 转换出错。
其实都是因为 mybatis 当 ResultMap 为 map 时,会把数据的原始类型原样返回,所以得到的map里面都是 oracle.sql.DATE、oracle.sql.TIMESTAMP 之类的。因为 mybatis 在没有指定类型时都会采用 ObjectTypeHandle 来处理字段。
解决方案:
自定义 typeHandle 来统一处理数据库字段类型为 timestamp 等特殊的字段。
这里 typeHandle 里面使用注解配置 JdbcType 和 JavaType。这两个注解的定义是:
- @MappedTypes 定义的是 JavaType 类型,可以指定哪些 Java 类型被拦截。
- @MappedJdbcTypes 定义的是 JdbcType 类型,它需要满足枚举类 org.apache.ibatis.type.JdbcType 所列的枚举类型。
代码如下:
myBatis 的配置文件中加入:
<typeHandlers>
<typeHandler handler="com.yule.system.typehandler.MyObjectTypeHandle"/>
</typeHandlers>
新增新的 java 类:
package com.yule.system.typehandler; import oracle.sql.DATE;
import oracle.sql.TIMESTAMP;
import oracle.sql.TIMESTAMPLTZ;
import oracle.sql.TIMESTAMPTZ;
import org.apache.ibatis.type.*; import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date; /**
* 模仿 ObjectTypeHandle 来处理 timestamp 报错问题
* @author yule
* @date 2018/9/26 22:43
*/
@MappedTypes({Object.class})
@MappedJdbcTypes(value = {JdbcType.TIMESTAMP})
public class MyObjectTypeHandle extends BaseTypeHandler<Object> { public MyObjectTypeHandle() {
} @Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
ps.setObject(i, parameter);
} @Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
Object result = rs.getObject(columnName);
return rs.wasNull() ? null : dealResult(result);
} @Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
Object result = rs.getObject(columnIndex);
return rs.wasNull() ? null : dealResult(result);
} @Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
Object result = cs.getObject(columnIndex);
return cs.wasNull() ? null : dealResult(result);
} /**
* 为了解决错误:
* 26-Sep-2018 14:21:06.634 WARNING [http-apr-8080-exec-6] org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException:
* Could not write JSON: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer
* (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS);
* nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
* (through reference chain: java.util.HashMap["pageData"]->java.util.ArrayList[0]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"])
* @param result
* @return
* @throws SQLException
*/
private Object dealResult(Object result) throws SQLException {
if (result instanceof TIMESTAMP) {
return new Date(((TIMESTAMP) result).dateValue().getTime());
} else if (result instanceof DATE) {
return new Date(((DATE) result).dateValue().getTime());
} else if (result instanceof TIMESTAMPLTZ) {
return new Date(((TIMESTAMPLTZ) result).dateValue().getTime());
} else if (result instanceof TIMESTAMPTZ) {
return new Date(((TIMESTAMPTZ) result).dateValue().getTime());
} else{
return result;
}
}
}
转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9708485.html
解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错的更多相关文章
-
解决:oracle+myBatis ResultMap 类型为 map 时,表字段类型有 Long/Blob/Clob 时报错
前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" .如果数据库中的表里有字段类型为 Long 等类型时,my ...
-
Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法
转: Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法 更新时间:2018年02月14日 17:13:03 投稿:wdc 我要评论 Java开发中 ...
-
sql中有一些保留字,当你的字段名是它的保留字时,这个时候sql语句的字段不加``就会报错
sql中有一些保留字,当你的字段名是它的保留字时,这个时候sql语句的字段不加``就会报错
-
mybatis mapper.xml 写关联查询 运用 resultmap 结果集中 用 association 关联其他表 并且 用 association 的 select 查询值 报错 java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mybatis.map
用mybaits 写一个关联查询 查询商品表关联商品规格表,并查询规格表中的数量.价格等,为了sql重用性,利用 association 节点 查询 结果并赋值报错 商品表的mapper文件为Gooo ...
-
解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束
Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...
-
Java处理JPEG图片时,需要导入com.sun.image.codec.jpeg.JPEGImageEn,报错处理
Java处理JPEG图片时,需要导入com.sun.image.codec.jpeg.JPEGImageEn,会报错,不能使用相应的方法. 原因:java访问限制级api的时候,默认的eclipse设 ...
-
在Openstack H版部署Nova Cell 时 ,终端输入nova service-list 和 nova host-list 命令将报错
关于Cell的基本介绍,可以参考贤哥的一篇文章: [OpenStack]G版中关于Nova的Cell http://blog.csdn.net/lynn_kong/article/details/8 ...
-
IDEA导入maven中导入net.sf.json报错的解决方法
使用IDEA搭建Maven项目导入架包时, 添加net.sf.json的jar包的时候,代码如下: 在pom.xml文件时: <dependency> <groupId>net ...
-
解决连接oracle报错 尝试加载Oracle客户端库时引发BadImageFomatException。如果在安装64位Oracle客户端组件的情况下以32位模式运行,将出现此问题的报错。
最近遇到一个.NET连接Oracle的一个错误,其主要原因是换了一台电脑,在新电脑上运行以前的项目出现了的一个错误,工作环境为vs2017+Oracle 64位,win10系统 这个错误头疼了一天,找 ...
随机推荐
-
解决Inno Setup制作中文安装包在非中文系统上显示乱码的问题
尼玛,好几个月没更新了.囧... 目前我司新的客户端开发已经接近尾声,该改的bug已经改完,该重构的地方也都差不多了.视觉效果也已经根据美工的样式改完了.所以,就差制作安装包了.正所谓万事俱备,只欠东 ...
-
C语言 单引号 双引号问题
C语言中的单引号和双引号含义迥异,用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值,因此,采用ASCII字符集的编译器而言,‘a’的含义与0141或97严格一 ...
-
HTML在IE中的条件注释
HTML在IE中的条件注释 HTML的条件注释在IE5中被首次引入,直到IE9.一直都是简单地判定用户浏览器(IE,非IE,IE版本)的一种手段,而在IE10的标准模式下,条件注释功能被停止支持(兼容 ...
-
Linux配置防火墙 开启80端口
vi /etc/sysconfig/iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(允许80端口通过防火 ...
-
通过IP连接网上打印机(转载)
From:http://zhidao.baidu.com/link?url=YZzFWur4-UZrNEobHv9zTkbYocMAjKkCq0LBj1QjJ6wApUT7MljxoD8JMBREUH ...
-
ZOJ3228 - Searching the String(AC自动机)
题目大意 给定一个文本串,接下来有n个模式串,每次查询模式串出现的次数,查询分两种,可重叠和不可重叠 题解 第一次是把AC自动机构造好,跑n次,统计出每个模式串出现的次数,交上去果断TLE...后来想 ...
-
Extjs6(特别篇)——项目自带例子main.js拆分详解
本文基于extjs6.0.0 一.拆分代码来看看 1.主页面main是个tab页: 写一些页面的依赖: 标明页面的controller和viewModel Ext.define('Learning.v ...
-
Codeforces Round #408 (Div. 2)(A.水,B,模拟)
A. Buying A House time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
-
洛谷P1072 Hankson 的趣味题(题解)
https://www.luogu.org/problemnew/show/P1072(题目传送) 数学的推理在编程的体现越来越明显了.(本人嘀咕) 首先,我们知道这两个等式: (a0,x)=a1,[ ...
-
angular $resouse服务
创建服务 var taskInstancesResource = function ($resource) { var resource = $resource('/ssc-cutover/rest/ ...