关于代码编写规范的疑问,spring mvc 控制层一段代码被多次复制重用,如何设计优化

业务逻辑大概如下:
功能:用户留咨保存功能
视图层:留咨界面,用户填写信息
控制层:校验数据合法,并依据request从cookies中取出用户城市站、usertraceId等信息,根据request请求头判断设备类型。最终封装实体调用入库接口。
服务层:验重、保存数据。
问题:
控制层做入参校验理所当然,没有问题。现在问题来了,此控制器承载多方留咨请求,,绝大部分业留咨务都可以直接请求,变化来了,在另一种业务条件下,如领优惠券,产品提了需求,要求用户领券成功之后在再调用用户留咨接口。我初始想在领券控制器中判断,成功后直接调用用户留咨控制器,避免一系列参数校验逻辑再写一遍,也不用再重写从request里面获取cookies等方法。但是考虑到mvc的设计,不应该控制层调取控制层(redirect除外)但是不调用,着一系列的逻辑我又要重写一份。又想到把校验逻辑和取cookies和设备信息放到service层,但是需要操作request,request是控制层操作的,如果把request带到服务端,那样也破坏了编码规范,至少这个服务类方法的test ng你都很难跑。不能new一个request对象吧。
所以不知道如何设计才好?难道我还是要把校验等代码复制一份?求探讨指教

3个回答

验证的事情交给拦截器去做

xiao_nini
圆圆 uuu
一年多之前 回复
qq_40959736
qq_40959736 验证的事情交给拦截器去做
一年多之前 回复
l523115401
寒风逝流 想到了,在这个业务里使用不太适合。这个领券控制器是有逻辑的,只有在特定渠道调用的领券才会留咨,拦截器把领券请求也加上是不是显的不太合理呢,毕竟大部分领券是不需要留咨的。当然这只是一种情况
一年多之前 回复
cangketie
cangketie 你好酷啊,都玩这个了
一年多之前 回复
l523115401
寒风逝流 我想过用拦截器,方法可行,可是拦截器处理这种逻辑感觉怪怪的
一年多之前 回复

有几个办法:
1、如果Service层不想让request对象作为参数传入,可以在Controller层将request对象的参数放到ThreadLocal中,可以线程安全地传入Service层。
2、也可以采用创建工厂设计模式,动态地去获取对应的Service
3、也可以跳出MVC的范畴,往微服务靠一靠。比如说把现有的业务拆分成上下游两个服务,第一层服务是Controller,第二层服务是Service,两层服务间的调用。

封装类 对其实例化或在放入配置文件中

l523115401
寒风逝流 封装类?不太明白,这是要从request取数据的,封装类里把数据写进去?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!