java实际开发中使用建造者模式导致数据导入时出现数据为null问题解决

目录

 

前言

问题描述

 原因分析

问题解决

 收获心得


 

前言

    我们在实际开发中都会用到很多设计模式,但是不知道大家在开发中有没有遇到过因为使用设计模式出现错误,今天我就遇见了一个没有遇见过的bug,在说这个问题之前我们先简单介绍一下设计者模式的分类:
总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

问题描述

        下图是我们需要导入的表格数据,可以看到,我们导入的excel中是由对应的数据的 

25b3e0fd0e354b5b807cbf7d15647dd8.png

但是使用easyexcel监听数据的时候却发现并没有获取到数据

fd5cea64240143cbb8e875518cd2237b.png

 原因分析

       经过一系列繁琐的调试、反复的研究代码和询问师傅的想法,最终发现本次错误出现在建造者模式的使用上,所以我在这里也先给给大家详细的介绍下建造者模式的原理。

        建造者模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

        体现在代码中就是我们如果不使用建造者模式,仅仅使用普通的set方法的话不会返回任何值(void),但是在使用了建造者模式后就可以返回任意的对象,这样我们在实际开发中就可以根据业务逻辑进行一系列的变通,代码写起来也会更加灵活和解耦,lombok开源框架所提供的一个注解@Accessors(chain = true)注解时返回的就是对象本身,实现比较简单的建造者模式,可以通过set方法后连续的对对象属性进行赋值,让代码看起来会更加简洁,像下面这样

new MessageTemplateModel().setTemplateName("templateName").setTitle("title");

8c08de08041340479bcfb31e457a711d.png

         但是在做数据导入时如果加上建造者模式就会出现问题,因为原先导入时使用set方法是并不需要返回值的,现在加上建造者模式的注解后就会返回本身对象,而 cglib(代理模式) 只获取返回值是 void 类型的 set 方法,所以这就导致了在数据导入中使用代理对象进行赋值出现了获取数据为空的问题

问题解决

        当我们清楚问题出现的原理后那解决的方法也就很简单了,因为在数据导入的时候会自动给对象属性进行赋值,所以其实在做数据导入时本来就不需要使用建造者模式,但是出于平时的开发习惯还是加上了这个注解(下次再加直接剁手),先把@Accessors(chain = true)注解去除:

2b6bdee5525e408f8a1a7b2c68f09bff.png

 最终效果就是数据可以正常获取到了

6a6ca8cc643e46ecb02244fa6804ece3.png

 收获心得

        其实这个问题的解决并不难,就像我们平时在排查问题的时候一样,最主要的还是找到问题出现的原因,明白问题出现的根本原因之后才能算是真正的解决问题,所以遇到事情不能着急,更不能对遇到的问题有那种能解决问题就行的心态,对于计算机行业来说,要有刨根问底,深度理解事件出现的根本原因的心理,这样才会对自己以后工作和技能的提升更有帮助

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值