工程优化记录

本文记录了一次工程优化的过程,涉及Spring的@RequestParam和@RequestBody用法,详细解释了如何将签名计算移到过滤器以解决参数流问题,并简述了Spring事务管理的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有时间优化手头的工程,看着之前的代码,简直惨目忍睹。一年之后重新写博客,就从记录这次工程优化开始。

1. spring @RequestBody @RequestParam用法

优化前代码:
@RequestMapping(value = XXX, method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public ResponseEntity<String> 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<String> XXX(@RequestBody ReqBody reqBody) {
    
}
对于多个参数的接口可以直接用有类来接收参数,避免手动解析json对象。如果参数不多,也可以用注解@RequestParm来分别映射参数,例如:
@RequestMapping(value = liveOpen, method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public ResponseEntity<String> 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.youkuaiyun.com/chenleixing/article/details/44573495


3. spring事务管理

spirng提供两种方式的事务管理:编程式事务和声明式事务。编程式事务通过TransactionTemplate模板支持事务操作,至于TransactionTemplate.execute方法中的代码,抛出RuntimeException后回滚事务;声明式事务基于AOP实现,在配置文件中注入事务管理器,并定义切面实现对方法级别的事务管理。相比于编程式事务,声明式事务对代码的入侵更少,可以配置模板化的事务属性并运用到多个项目中;编程式事务的独特之处在于可以对某一代码块进行事务管理,但这也可以通过将代码块抽离为单独的方法后用声明式事务替代。总而言之,声明式事务应作为spring事务管理的第一选择。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值