Mybatis和objectMapper的问题

2024-06-04 05:38
文章标签 问题 mybatis objectmapper

本文主要是介绍Mybatis和objectMapper的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用了Mybatis的懒加载,即

<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 按需延迟加载 -->
<setting name="aggressiveLazyLoading" value="false"/>

xml中

<select id="queryByID" resultMap="pojoResultMap">
SELECT
*
FROM
<include refid="tableName"/>
WHERE order_id = #{id};
</select>

<sql id="tableName">tb_order</sql>

<resultMap type="Order" id="pojoResultMap" autoMapping="true">
<id column="order_id" property="orderId"/>
<association property="orderShipping" javaType="OrderShipping" column="order_id" select="queryOrderShippingByOrderId" autoMapping="true"></association>
<collection property="orderItems" javaType="Arraylist" ofType="OrderItem" autoMapping="true" select="queryOrderItemByOrderId" column="order_id">
</collection>
</resultMap>

<select id="queryOrderShippingByOrderId" resultType="OrderShipping" parameterType="String">
SELECT * FROM tb_order_shipping WHERE order_id = #{orderId};
</select>

<select id="queryOrderItemByOrderId" resultType="OrderItem" parameterType="String">
SELECT * FROM tb_order_item WHERE order_id = #{orderId};
</select>

Order类,只列出部分属性:

public class Order {
private String orderId;//id+时间戳
@NotEmpty
private List<OrderItem> orderItems;//商品详情
private OrderShipping orderShipping; //物流地址信息

setter和getter略

}

查询Order时会出现两个问题,出现问题的本质原因是:这种查询返回的Order对象会多一个handler属性(代理对象):

1、如果使用springmvc返回json会报解析错误。解决方法是写一个Mapper继承ObjectMapper 

public class CustomMapper extends ObjectMapper {
/**

*/
private static final long serialVersionUID = 1L;


public CustomMapper() {
this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 设置 SerializationFeature.FAIL_ON_EMPTY_BEANS 为 false
this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
}
}

然后在spring-servlet.xml的<mvc:annotation-driven>下面<mvc:message-converters>追加:

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <!-- 配置 objectMapper 为我们自定义扩展后的 CustomMapper -->
            <property name="objectMapper">
                <bean class="com.taotao.store.order.util.CustomMapper">
                </bean>
            </property>
        </bean>
</mvc:message-converters>
</mvc:annotation-driven>

这个作用其实就是在解析时忽略对象中某些不存在的属性。比如Order类中根本没有handler属性。

2、当我们以调api方式获取resposeBody的json字符串后,要做反序列化,比如Order order = MAPPER.readValue(respBody, Order.class);

但Order中没有handler属性,respBody中有handler属性,那怎么办?

第一种方法:要对MAPPER进行配置,即在使用前调用MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);这样就不会解析这种不存在的属性了

第二种方法:在pojo类上使用@JsonIgnoreProperties(ignoreUnknown = true),比如在Order类上用这个注解。注意,这个注解无法解决上面第一个问题。

---------------------------------------

List<Cart> list = MAPPER.readValue(respBody,
MAPPER.getTypeFactory().constructCollectionType(List.class, Cart.class));

这篇关于Mybatis和objectMapper的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029208

相关文章

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推