最近有时间优化手头的工程,看着之前的代码,简直惨目忍睹。一年之后重新写博客,就从记录这次工程优化开始。
1. spring @RequestBody @RequestParam用法
优化前代码:
@RequestMapping(value = XXX, method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public ResponseEntity XXX(@RequestBody String requestBody) {
// 解析请求参数
JSONObject json = JSON.parseObject(requestBody);
Long id = json.getLong("id");
}
优化后代码:
@RequestMapping(value = XXX, method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public ResponseEntity XXX(@RequestBody ReqBody reqBody) {
}
对于多个参数的接口可以直接用有类来接收参数,避免手动解析json对象。如果参数不多,也可以用注解@RequestParm来分别映射参数,例如:
@RequestMapping(value = liveOpen, method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public ResponseEntity liveOpen(@RequestParam long id) {
}
但对于POST请求,@RequestParam只支持Content-Type为application/x-www-form-urlencoded,若Content-Type为application/json,用@RequestParam映射POST请求的参数spring会提示语法错误。
2. 签名统一移至过滤器
接口通过对参数按一定规则计算签名进行访问认证,当接口改为@RequestParam的方式接收参数后,参数流被读取后,无法重新获取用于计算签名。为解决此问题,将签名计算的代码统一移至servlet过滤器,过滤器读取参数用于计算签名后,再将参数重现写入字节流至于ServletRequest中向下传递。通过过滤器解决参数流被@RequestParam读取后无法计算签名的同时,也减少了代码的冗余。
过滤器与拦截器的区别及执行顺序见:http://blog.csdn.net/chenleixing/article/details/44573495
3. spring事务管理
spirng提供两种方式的事务管理:编程式事务和声明式事务。编程式事务通过TransactionTemplate模板支持事务操作,至于TransactionTemplate.execute方法中的代码,抛出RuntimeException后回滚事务;声明式事务基于AOP实现,在配置文件中注入事务管理器,并定义切面实现对方法级别的事务管理。相比于编程式事务,声明式事务对代码的入侵更少,可以配置模板化的事务属性并运用到多个项目中;编程式事务的独特之处在于可以对某一代码块进行事务管理,但这也可以通过将代码块抽离为单独的方法后用声明式事务替代。总而言之,声明式事务应作为spring事务管理的第一选择。