使用Spring AOP预处理Controller的参数
实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用,比如有这样一个Controller
@Controller
public class MatchOddsController {
@Autowired
private MatchOddsServcie matchOddsService;
@RequestMapping(value = "/listOdds", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
@ResponseBody
public List<OddsModel> listOdds(@RequestParam Date startDate, @RequestParam Date endDate) {
return matchOddsService.listOdds(startDate, endDate);
}
}
前台传过来的startDate和endDate是两个日期,实际使用中我们需要将之转换为两个日期对应的当天11点,如果只有这么一个类的话,我们是可以直接在方法最前面处理就可以了
但是,还有下面两个类具有同样的业务逻辑
@Controller
public class MatchProductController {
@Autowired
private MatchProductService matchProductService;
@RequestMapping(value = "/listProduct", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE })
@ResponseBody
public List<ProductModel> listProduct(@RequestParam Date startDate, @RequestParam Date endDate) {
return matchProductService.listMatchProduct(startDate, endDate);
}
}
@Controller
public class MatchController {
@Autowired
private MatchService matchService;
@RequestMapping(value = "/listMatch", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
@ResponseBody
public List<MatchModel> listMatch(@RequestParam Date startDate, @RequestParam Date endDate) {
return matchService.listMatch(startDate, endDate);
}
}
当然也可以写两个util方法,分别处理startDate和endDate,但是为了让Controller看起来更干净一些,我们还是用AOP来实现吧,顺便为AOP更复杂的应用做做铺垫
本应用中使用Configuration Class来进行配置,主配置类如下:
@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass = true) //开启AspectJ代理,并将proxyTargetClass置为true,表示启用cglib对Class也进行代理
public class Application extends SpringBootServletInitializer {
...
}
下面新建一个Aspect类,代码如下
@Aspect //1
@Configuration //2
public class SearchDateAspect {
@Pointcut("execution(* com.ronnie.controller.*.list*(java.util.Date,java.util.Date)) && args(startDate,endDate)") //3
private void searchDatePointcut(Date startDate, Date endDate) { //4
}
@Around(value = "searchDatePointcut(startDate,endDate)", argNames = "startDate,endDate") //5
public Object dealSearchDate(ProceedingJoinPoint joinpoint, Date startDate, Date endDate) throws Throwable { //6
Object[] args = joinpoint.getArgs(); //7
if (args[0] == null) {
args[0] = Calendars.getTodayEleven();
args[1] = DateUtils.add(new Date(), 7, TimeUnit.DAYS);//默认显示今天及以后的所有赔率
} else {
args[0] = DateUtils.addHours(startDate, 11);
args[1] = DateUtils.addHours(endDate, 11);
}
return joinpoint.proceed(args); //8
}
}
分别解释一下上面各个地方的意思,标号与语句之后的注释一致
- 表示这是一个切面类
- 表示这个类是一个配置类,在
ApplicationContext启动时会加载配置,将这个类扫描到 - 定义一个切点,
execution(* com.ronnie.controller.*.list*(java.util.Date,java.util.Date))表示任意返回值,在com.ronnie.controller包下任意类的以list开头的方法,方法带有两个Date类型的参数,args(startDate,endDate)表示需要Spring传入这两个参数 - 定义切点的名称
- 配置环绕通知
ProceedingJoinPoint会自动传入,用于处理真实的调用- 获取参数,下面代码是修改参数
- 使用修改过的参数调用目标类
更多可参考
- http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html
- http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
http://blog.csdn.net/ro_wsy/article/details/50858810
使用Spring AOP预处理Controller的参数的更多相关文章
- Spring AOP切面的时候参数的传递
Spring AOP切面的时候参数的传递 Xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...
- spring aop通过joinpoint传递参数
三.总结. 我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得. 三.总结. 我们可以通过Advice中添加一个JoinPoint ...
- spring aop 利用JoinPoint获取参数的值和方法名称
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...
- Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)
一.接收参数(postman发送) 1.form表单 @RequestParam("name") String name 会把传递过来的Form表单中的name对应 ...
- Spring AOP获取方法的参数名称和参数值
aop配置: <aop:aspectj-autoproxy expose-proxy="true" /> @Before(value = "execution ...
- Spring Aop 修改目标方法参数和返回值
一.新建注解 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Document ...
- Spring Aop——给Advice传递参数
给Advice传递参数 Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入点方 ...
- spring aop 解决模糊查询参数 % - /等特殊符号问题
import com.hsq.common.utils.StringUtil;import org.aspectj.lang.ProceedingJoinPoint;import org.aspect ...
- spring aop 实现controller 日志
@Aspect @Component @Slf4j public class ControllerAspact { @Pointcut("execution(public * com.exa ...
随机推荐
- 关于onSaveInstanceState的javadoc的渣渣翻译
/** * Called to retrieve per-instance state from an activity before being * killed so that the state ...
- 安卓百度地图开发so文件引用失败问题研究
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 # 问题 首先,下面的问题基本都是在Android Studio下使用不当导致,eclipse是百 ...
- (SQL Analyzer services)定义链接维度
链接文档是在一个 Analysis Services 数据库中存在.但在相同版本和兼容级别的另一个 Analysis Services 数据库中重复使用的一种文档. 链接文档是只读的. 如果您想要修改 ...
- 获取汉字拼音 Java
两种方法:一个是使用btye数组,一个是引入jar包进行操作. 1. public class CharacterParser { private static int[] pyvalue = new ...
- 常见错误总结_1_对java类进行修改后,无法按修改的类型加载
1.这是因为没有run的原因,对类进行修改一定要run一遍 2.至于要不要重新tomcat部署,取决于你是修改了变量还是方法,拿不定的时候都重新加载一遍看看.
- 周末充电之WPF(一).初试牛刀
追的剧已经赶上更新的速度了,突然觉得一下子就闲了.趁着这点时间,刚好学点 WPF .看到这边,好多人估计得感叹技术宅约等于单身狗,哈哈.好了,赶紧进入学习状态. 关注 WPF 或者说对它感兴趣其实多半 ...
- c语言全局变量与局部变量(当变量重名时)的使用情况
在c语言中,变量有全局变量和局部变量之分,这一点和很多高级语言类似,如c#,java等.不过与c#,java中的局部变量如在全局变量作用域内则不允许与全局变量名相同,而c语言是允许这样做的.这样的做法 ...
- 04_XML_01_入门基础
[什么是XML] Extensible Markup Language,翻译过来即可扩展标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 在XML语言中,它允 ...
- jsp a标签传值到action中,action接收不到传值
因为需求,今天在action中加了一个marker属性,尝试了很多方法 set,get方法也生成了,但是就接收不到值. 这时我注意到action中有我之前使用ajax请求数据返回json格式数据,不以 ...
- javascript 事件流及应用
当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序发生该元素的触发 事件,事件传播的顺序叫做事件流 1.事件流的分类: A.冒泡型事件(所有浏览器都支持) 由明确的事件源到最不确定 ...