SpringBank 开发日志 重新设计Action调用Service的参数传递 使用泛型解决类型转换问题
2017-07-31 18:08
841 查看
之前想的比较简单,请求到达controller的时候,传给action的参数没有经过任何封装,就是一个Map。然后action再调用service的时候,传递的参数也是map
但是当我在做存款交易的时候,我隐隐约感觉这样很有问题,因为再action里面完全无法看出来付款人收款人金额等等重要信息,虽然实际上这些信息在调用Service之前会经过一系列拦截器,但是当到达service里面的时候,参数又要从map里面get一遍,感觉很不舒服,就像没有经过校验的原始数据一样。
所以我想确实action调用service的时候,应该将参数封装到专门的请求参数类里面。
以日切交易为例,我搞了一个NextAccountingDateRequest,封装该Service需要的参数(实际上这个交易没有任何参数,只是举例)
但是我是反射的方式调用Service,所有的service都继承了上面的这个抽象类Service,所以execute方法的参数就是需要考虑的问题。一开始如上图所示,我使用Object来接收,可是Service里面呢
这里肯定就编译不过了,需要强转。所以为了解决这个问题,最终使用了泛型
使用泛型过后的抽象Service类就是上面这样。
这样一来就避免立刻了在代码中出现强制转换的多余的代码,当然编译器可能也是强转的。但至少自己写的代码看起来整洁多了
@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类就是上面这样。
这样一来就避免立刻了在代码中出现强制转换的多余的代码,当然编译器可能也是强转的。但至少自己写的代码看起来整洁多了
相关文章推荐
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...今天
- 开发日志:onclick调用js方法传递多个使用struts标签获取的参数
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- JAVAWEB开发之Struts2详解(二)——Action接受请求参数、类型转换器、使用Struts2的输入校验、以及遵守约定规则实现Struts2的零配置
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- C#调用Java端Web服务(CXF)时发生Integer参数类型无法传递的问题
- dephi调用DotNet2.0参数传递和乱码问题解决
- JqGrid往后台传递查询参数使用Filters时的参数类型转换.
- 使用mssql2008新特性(存储过程参数类型使用"用户自定义表"来实现批量DML更新多表)解决项目里遇到的性能问题
- 线程安全问题(解决) -------使用spring 的action-servlet.xml解决struts线程问题
- 使用eval命令解决shell脚本中函数嵌套调用中的参数问题
- EF.使用反射解决实体类型转换问题
- [原创]使用RemObjects Hydra 开发 RemObjects SDK Service 过程中的异常问题解决
- 将java的集合转换为数据库集合类型 解决weblogic调用存储过程的时候,返回值乱码问题
- 使用asx3m与xstream配合解决flex与java利用httpservice传递xml数据问题
- 从EXCEL导入文件时无法将DBNull.Value强制转换为类型。。。,请使用可空类型 问题的解决
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- Struts2 使用拦截器后参数无法传递问题的解决