前言:最近在做一个通用查询单表的组件,所以 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 的配置文件中加入:

  1. <typeHandlers>
  2. <typeHandler handler="com.yule.system.typehandler.MyObjectTypeHandle"/>
  3. </typeHandlers>

新增新的 java 类:

  1. package com.yule.system.typehandler;
  2.  
  3. import oracle.sql.DATE;
  4. import oracle.sql.TIMESTAMP;
  5. import oracle.sql.TIMESTAMPLTZ;
  6. import oracle.sql.TIMESTAMPTZ;
  7. import org.apache.ibatis.type.*;
  8.  
  9. import java.sql.CallableStatement;
  10. import java.sql.PreparedStatement;
  11. import java.sql.ResultSet;
  12. import java.sql.SQLException;
  13. import java.util.Date;
  14.  
  15. /**
  16. * 模仿 ObjectTypeHandle 来处理 timestamp 报错问题
  17. * @author yule
  18. * @date 2018/9/26 22:43
  19. */
  20. @MappedTypes({Object.class})
  21. @MappedJdbcTypes(value = {JdbcType.TIMESTAMP})
  22. public class MyObjectTypeHandle extends BaseTypeHandler<Object> {
  23.  
  24. public MyObjectTypeHandle() {
  25. }
  26.  
  27. @Override
  28. public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
  29. ps.setObject(i, parameter);
  30. }
  31.  
  32. @Override
  33. public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
  34. Object result = rs.getObject(columnName);
  35. return rs.wasNull() ? null : dealResult(result);
  36. }
  37.  
  38. @Override
  39. public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
  40. Object result = rs.getObject(columnIndex);
  41. return rs.wasNull() ? null : dealResult(result);
  42. }
  43.  
  44. @Override
  45. public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
  46. Object result = cs.getObject(columnIndex);
  47. return cs.wasNull() ? null : dealResult(result);
  48. }
  49.  
  50. /**
  51. * 为了解决错误:
  52. * 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:
  53. * Could not write JSON: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer
  54. * (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS);
  55. * 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)
  56. * (through reference chain: java.util.HashMap["pageData"]->java.util.ArrayList[0]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"])
  57. * @param result
  58. * @return
  59. * @throws SQLException
  60. */
  61. private Object dealResult(Object result) throws SQLException {
  62. if (result instanceof TIMESTAMP) {
  63. return new Date(((TIMESTAMP) result).dateValue().getTime());
  64. } else if (result instanceof DATE) {
  65. return new Date(((DATE) result).dateValue().getTime());
  66. } else if (result instanceof TIMESTAMPLTZ) {
  67. return new Date(((TIMESTAMPLTZ) result).dateValue().getTime());
  68. } else if (result instanceof TIMESTAMPTZ) {
  69. return new Date(((TIMESTAMPTZ) result).dateValue().getTime());
  70. } else{
  71. return result;
  72. }
  73. }
  74. }

转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9708485.html

解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错的更多相关文章

  1. 解决:oracle+myBatis ResultMap 类型为 map 时,表字段类型有 Long/Blob/Clob 时报错

    前言:最近在做一个通用查询单表的组件,所以 sql 的写法就是 select *,然后 resultType="map" .如果数据库中的表里有字段类型为 Long 等类型时,my ...

  2. Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法

    转: Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法  更新时间:2018年02月14日 17:13:03   投稿:wdc   我要评论   Java开发中 ...

  3. sql中有一些保留字,当你的字段名是它的保留字时,这个时候sql语句的字段不加``就会报错

    sql中有一些保留字,当你的字段名是它的保留字时,这个时候sql语句的字段不加``就会报错

  4. 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 ...

  5. 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

    Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...

  6. Java处理JPEG图片时,需要导入com.sun.image.codec.jpeg.JPEGImageEn,报错处理

    Java处理JPEG图片时,需要导入com.sun.image.codec.jpeg.JPEGImageEn,会报错,不能使用相应的方法. 原因:java访问限制级api的时候,默认的eclipse设 ...

  7. 在Openstack H版部署Nova Cell 时 ,终端输入nova service-list 和 nova host-list 命令将报错

    关于Cell的基本介绍,可以参考贤哥的一篇文章: [OpenStack]G版中关于Nova的Cell  http://blog.csdn.net/lynn_kong/article/details/8 ...

  8. IDEA导入maven中导入net.sf.json报错的解决方法

    使用IDEA搭建Maven项目导入架包时, 添加net.sf.json的jar包的时候,代码如下: 在pom.xml文件时: <dependency> <groupId>net ...

  9. 解决连接oracle报错 尝试加载Oracle客户端库时引发BadImageFomatException。如果在安装64位Oracle客户端组件的情况下以32位模式运行,将出现此问题的报错。

    最近遇到一个.NET连接Oracle的一个错误,其主要原因是换了一台电脑,在新电脑上运行以前的项目出现了的一个错误,工作环境为vs2017+Oracle 64位,win10系统 这个错误头疼了一天,找 ...

随机推荐

  1. 「BZOJ1095」[ZJOI2007] Hide 捉迷藏

    题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条 ...

  2. C++中vector的使用

    在c++中,vector是一个十分有用的容器. 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中 ...

  3. Retrofit源码解析(下)

    接着上一章继续分析上一章主要简单说了一下基本使用和注解,这一章,我们主要看源码,废话不多说了,直接上.先上一张图 从网络上拿来的 前面一章说了一下Retrofit的简单使用https://www.cn ...

  4. VUE 项目刷新路由指向index.html

    背景描述: VUE 项目经过 npm run bulid 生成静态文件上传到服务器后,当我们切换路由并刷新页面,nginx 服务器会报 502 或者 404 错误. 原因分析: 我猜测是因为在 VUE ...

  5. OAuth 2.0 - Authorization Code授权方式详解

    I:OAuth 2.0 开发前期准备 天上不会自然掉馅饼让你轻松地去访问到人家资源服务器里面的用户数据资源,所以你需要做的前期开发准备工作就是把AppKey, AppSecret取到手 新浪获取传送门 ...

  6. Fiddler工具详细介绍

    百度看到Fiddler工具的详细介绍,转载收藏,侵权删,原文地址:http://blog.csdn.net/qq_21445563/article/details/51017605 前部分讲解Fidd ...

  7. Top Leaders社区发现算法(top leaders community detection approach in information networks)

    一.概念 复杂网络:现实生活中各种系统都可以看做成复杂网络,复杂网络构成包括节点和边,节点是网络中的基本组成单元,节点之间的联系或者关系是网络中的边.例如 电力网络:基站代表节点,基站之间是否互通表示 ...

  8. [webpack]path、publicPath、--content-base 理解

    附源码:http://files.cnblogs.com/files/chenshao/startPublic.rar 'use strict'; var webpack = require('web ...

  9. mysql 数据库自动备份

    @echo offset "Ymd=%date:~,4%%date:~5,2%%date:~8,2%""E:/MySQL/MySQL Server 5.7/bin/mys ...

  10. Office Visio 201*安装详细步骤并激活

    不多说直接上干货! 初步了解:  Visio的百度百科:http://baike.baidu.com/link?url=tNv_gqhhVKcurpP8kvh4ylkknc5JQLIm6bGmQVxi ...