SpringBank 开发日志 重新设计Action调用Service的参数传递 使用泛型解决类型转换问题
之前想的比较简单,请求到达controller的时候,传给action的参数没有经过任何封装,就是一个Map。然后action再调用service的时候,传递的参数也是map
@Controller
public class DepositController extends BaseController{
@TransactionMapping(transaction = "Deposit")
public Map Deposit(Map request) {
Map map = callService(ServiceDict.DepositService, request);
return map;
}
}
但是当我在做存款交易的时候,我隐隐约感觉这样很有问题,因为再action里面完全无法看出来付款人收款人金额等等重要信息,虽然实际上这些信息在调用Service之前会经过一系列拦截器,但是当到达service里面的时候,参数又要从map里面get一遍,感觉很不舒服,就像没有经过校验的原始数据一样。
所以我想确实action调用service的时候,应该将参数封装到专门的请求参数类里面。
// 日切
@TransactionMapping(transaction = "NextAccountingDate")
public Map nextAccountingDate(Map request) {
Map map = callService(ServiceDict.NextAccountingDateService,new NextAccountingDateRequest());
return map;
}
以日切交易为例,我搞了一个NextAccountingDateRequest,封装该Service需要的参数(实际上这个交易没有任何参数,只是举例)
public abstract class Service {
private List<Interceptor> interceptorList;
@SuppressWarnings("rawtypes")
public abstract Map execute(Object request);
public List<Interceptor> getInterceptorList() {
return interceptorList;
}
public void setInterceptorList(List<Interceptor> interceptorList) {
this.interceptorList = interceptorList;
}
}
但是我是反射的方式调用Service,所有的service都继承了上面的这个抽象类Service,所以execute方法的参数就是需要考虑的问题。一开始如上图所示,我使用Object来接收,可是Service里面呢
public class NextAccountingDateService extends Service<NextAccountingDateRequest>{
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Map execute(NextAccountingDateRequest request) {
// TODO Auto-generated method stub
Map result = new HashMap();
//先查出当前账务日期
String pdat = DaoUtil.getMapper(SysparamMapper.class).selectByPrimaryKey(CommonDict.PDAT).getValue();
Date currentDate = DateUtil.getDateFromStr(pdat);
//计算下一日期
Date nextDate = DateUtil.getNextDate(currentDate);
//record
Sysparam record = new Sysparam();
record.setValue(DateUtil.getDateDashFormat(nextDate));
//example
SysparamExample example = new SysparamExample();
example.createCriteria().andKeyEqualTo(CommonDict.PDAT);
//do update
DaoUtil.getMapper(SysparamMapper.class).updateByExampleSelective(record, example);
//query again
pdat = DaoUtil.getMapper(SysparamMapper.class).selectByPrimaryKey(CommonDict.PDAT).getValue();
result.put("pdat", pdat);
return result;
}
}
这里肯定就编译不过了,需要强转。所以为了解决这个问题,最终使用了泛型
public abstract class Service<T> {
private List<Interceptor> interceptorList;
@SuppressWarnings("rawtypes")
public abstract Map execute(T request);
public List<Interceptor> getInterceptorList() {
return interceptorList;
}
public void setInterceptorList(List<Interceptor> interceptorList) {
this.interceptorList = interceptorList;
}
}
使用泛型过后的抽象Service类就是上面这样。
这样一来就避免立刻了在代码中出现强制转换的多余的代码,当然编译器可能也是强转的。但至少自己写的代码看起来整洁多了
SpringBank 开发日志 重新设计Action调用Service的参数传递 使用泛型解决类型转换问题的更多相关文章
- Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)
当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...
- SpringBank 开发日志 一种简单的拦截器设计实现
当交易由Action进入Service之前,需要根据不同的Service实际负责业务的不同,真正执行Service的业务逻辑之前,做一些检查工作.这样的拦截器应该是基于配置的,与Service关联起来 ...
- 08_Spring实现action调用service,service调用dao的过程
[工程截图] [PersonDao.java] package com.HigginCui.dao; public interface PersonDao { public void savePers ...
- Action调用Service
Java Web项目,写到Action的时候,往往会要引入Service,这个是一个常见的操作. 但是,我自认为引入Service需要给它get和set方法,并且这个习惯已经沿用到现在.然而,自从参与 ...
- SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包
写这篇日志的时候,我已经完成了这个目标,并且中间经历了一次面试.现在回过头看,已经觉得印象不那么深刻了,果然还是一边思考,一边记录这样最好.但我还是严格要求自己,从新做了梳理,对相关配置进行了整理和说 ...
- springbank 开发日志 springbank是如何注册handler的
这要从DefaultAnnotationHandlerMapping这个类说起,该类被@Component注释,该类被Spring IOC容器实例化之后,将会执行其initApplicationCon ...
- springbank 开发日志 Spring启动过程中对自定义标签的处理
这篇随笔的许多知识来源于:http://www.importnew.com/19391.html 之所以会去看这些东东,主要是希望能够模仿spring mvc的处理流程,做出一套合理的交易处理流程. ...
- 12_注解04_注解实现Action调用Service,Service调用Dao的过程
[工程截图] [PersonDao.java] package com.HigginCui.annotation; public interface PersonDao { public void s ...
- SpringBank 开发日志 Mybatis 使用redis 作为二级缓存时,无法通过cacheEnabled=false 将其关闭
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
随机推荐
- 用Python中的re做信息筛选
背景 平时工作中,我们经常会处理大量的元数据(Raw Data),而一般的文件编辑器只能一次查询一个关键字,这就难以连续的分析元数据,比如分析产品日志文件(log),日志可能包括很多informati ...
- 二、编译第一步 make xxx_defconfig
2.1 顶层make defconfig规则 make xxx_defconfig 的执行主要分成三个部分: 执行 make -f ./scripts/Makefile.build obj=scrip ...
- # 20155214 2016-2017-2 《Java程序设计》第8周学习总结
20155214 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 对于串流输入/输出使用inputStream/OutputStream来衔接数据源与目的地, ...
- Leanote 蚂蚁笔记 云笔记
Leanote 蚂蚁笔记 1.Leanote 数据存储是使用mongo存放的,所以需要安装mongo包 1.MongoDB 数据存储 Leanote 依赖 MongoDB 作为数据存储,下面开始安装 ...
- 超详细的Web前端开发规范文档
规范目的为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. 本文档如有不对或者不合 ...
- Linux组管理和权限管理
⒈Linux组基本介绍 1)在Linux中的每个用户必须属于一个组,不能独立于组外. 2)Linux中每个文件都有所有者.所在组.其它组的概念 ①所有者 一般(默认)为文件的创建者,谁创建了该文件,就 ...
- SpringMVC使用Burlap发布远程服务
参考这篇文章https://www.cnblogs.com/fanqisoft/p/10283156.html 将提供者配置类中的 @Bean public HessianServiceExporte ...
- bat判断ini文件内容
@echo off for /f "tokens=1" %%d in (config.ini) do ( if /I "%%d" equ "path= ...
- SSH原理与运用:远程登录
一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会 ...
- mtk 无线配置文件生效过程
openwrt 下无线接口的配置文件位于 /etc/config/wirless 中. 启动 /sbin/wifi 脚本后,生效过程如下: (1)通过 uci2dat 工具生成所需要的 .dat文件 ...