广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何使用Spring AOP预处理Controller的参数
  • 314
分享到

如何使用Spring AOP预处理Controller的参数

2024-04-02 19:04:59 314人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

spring aop预处理Controller的参数 实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用 比如有这样一个Controller @Con

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
    }
}

分别解释一下上面各个地方的意思,标号与语句之后的注释一致

  1. 表示这是一个切面类
  2. 表示这个类是一个配置类,在ApplicationContext启动时会加载配置,将这个类扫描到
  3. 定义一个切点,execution(* com.ronnie.controller.*.list*(java.util.Date,java.util.Date))表示任意返回值,在com.ronnie.controller包下任意类的以list开头的方法,方法带有两个Date类型的参数,args(startDate,endDate)表示需要Spring传入这两个参数
  4. 定义切点的名称
  5. 配置环绕通知
  6. ProceedingJoinPoint会自动传入,用于处理真实的调用
  7. 获取参数,下面代码是修改参数
  8. 使用修改过的参数调用目标类

更多可参考

Http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

AOP获取参数名称

由于项目中打印日志的需要,研究了一下在aop中,获取参数名称的方法。

1、jdk1,8中比较简单,直接通过joinPoint中的getSignature()方法即可获取


Signature signature = joinpoint.getSignature();  
MethodSignature methodSignature = (MethodSignature) signature;  
String[] strings = methodSignature.getParameterNames();  
System.out.println(Arrays.toString(strings));  

2.通用方法。比较麻烦


public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable{  
          
        String classType = joinPoint.getTarget().getClass().getName();    
        Class<?> clazz = Class.forName(classType);    
        String clazzName = clazz.getName();    
        String methodName = joinPoint.getSignature().getName(); //获取方法名称   
        Object[] args = joinPoint.getArgs();//参数  
          //获取参数名称和值  
        Map<String,Object > nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName,args);   
        System.out.println(nameAndArgs.toString());  
        //为了省事,其他代码就不写了,  
        return result = joinPoint.proceed();  
   
}  

private Map<String,Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws NotFoundException {   
        Map<String,Object > map=new HashMap<String,Object>();  
          
        ClassPool pool = ClassPool.getDefault();    
        //ClassClassPath classPath = new ClassClassPath(this.getClass());    
        ClassClassPath classPath = new ClassClassPath(cls);    
        pool.insertClassPath(classPath);    
            
        CtClass cc = pool.get(clazzName);    
        CtMethod cm = cc.getDeclaredMethod(methodName);    
        MethodInfo methodInfo = cm.getMethodInfo();  
        CodeAttribute codeAttribute = methodInfo.getCodeAttribute();    
        LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);    
        if (attr == null) {    
            // exception    
        }    
       // String[] paramNames = new String[cm.getParameterTypes().length];    
        int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;    
        for (int i = 0; i < cm.getParameterTypes().length; i++){    
            map.put( attr.variableName(i + pos),args[i]);//paramNames即参数名    
        }    
          
        //Map<>  
        return map;    
    } 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 如何使用Spring AOP预处理Controller的参数

本文链接: https://www.lsjlt.com/news/132124.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用Spring AOP预处理Controller的参数
    Spring AOP预处理Controller的参数 实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用 比如有这样一个Controller @Con...
    99+
    2022-11-12
  • 怎么使用Spring AOP预处理Controller的参数
    这篇文章主要为大家展示了“怎么使用Spring AOP预处理Controller的参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Spring AOP预处理Controller的参数”...
    99+
    2023-06-20
  • 使用AOP拦截Controller获取@PathVariable注解传入的参数
    目录AOP拦截Controller获取@PathVariable注解传入参数前言:示例代码:处理:扩展: aop中获取request和response动态参数使用@PathVaria...
    99+
    2022-11-12
  • 使用Spring Boot AOP处理方法的入参和返回值
    目录前言Spring AOP的简单介绍:1. 需求场景User类定义如下:2. 解决方案3. 代码实现Controller层UserController类的代码:Service层Us...
    99+
    2022-11-12
  • 如何使用@Valid+BindingResult进行controller参数校验
    这篇文章主要介绍“如何使用@Valid+BindingResult进行controller参数校验”,在日常操作中,相信很多人在如何使用@Valid+BindingResult进行controller参数校验问题上存在疑惑,小编查阅了各式资...
    99+
    2023-06-21
  • 如何使用批处理参数
    这篇文章给大家分享的是有关如何使用批处理参数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。可以在批处理文件内的任何地方使用批处理参数,以提取有关环境设置的信息。 Cmd.exe 提供批处理参数扩展变量(...
    99+
    2023-06-09
  • Spring:如何使用枚举参数
    目录 枚举参数确认需求定义枚举Converter 和 ConverterFactory加载配置测试总结 枚举参数 接口开发过程中不免有表示类型的参数,比如 0 表...
    99+
    2022-11-12
  • 使用controller接收js传过来的参数问题如何解决
    本文小编为大家详细介绍“使用controller接收js传过来的参数问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“使用controller接收js传过来的参数问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-05
  • Spring Boot请求处理之常用参数注解使用教程
    目录请求处理-SpringBoot常用参数注解使用1、@PathVariable注解2、@RequestHeader注解3、@RequestParam注解4、@CookieValue...
    99+
    2022-11-13
  • 如何在PHP中使用数据预处理函数
    数据预处理函数是一种用于 PHP 和数据库之间进行交互的方法。由于 SQL 非常容易受到注入式攻击的攻击,数据预处理函数的使用让我们能够更加安全地处理数据。在本文中,我们将学习如何在 PHP 中使用数据预处理函数。什么是数据预处理函数?数据...
    99+
    2023-05-18
    函数 PHP 数据预处理
  • Mysql prepare预处理如何使用
    在MySQL中,预处理语句可以用来执行动态SQL语句,可以有效地防止SQL注入攻击,并提高SQL语句的执行效率。使用预处理语句的步骤...
    99+
    2023-08-09
    Mysql prepare
  • CSS预处理器如何使用
    这篇文章给大家分享的是有关CSS预处理器如何使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   我们先来看一下什么是CSS预处理器?   默认的CSS是到现在为止不可能实...
    99+
    2022-10-19
  • 如何在不使用spring框架中使用aop的功能
    目录spring提供了两种方式的AOP使用使用xml配置方式使用注解方式AspectJ简介AspectJ的使用实例不使用spring的aop功能实现日志输出第一种第二种:通过面向接口...
    99+
    2022-11-12
  • 使用Python对EXCEL数据的预处理
    一、熟悉数据 我们将EXCEL中的数据导入之后,需要对数据进行大致性的了解,当对数据充分地了解之后,才便于后期的分析工作。 该部分涉及到四个基本方法,分别为“shape&...
    99+
    2023-03-22
    Python EXCEL数据预处理 Python 数据预处理
  • 带你了解如何使用Spring基于ProxyFactoryBean创建AOP代理
    目录1 基础2 JavaBean属性3 JDK和CGLIB代理总结若使用 Spring IoC 容器(ApplicationContext或BeanFactory)作为你的业务对象(...
    99+
    2022-11-12
  • 在批处理文件中如何使用参数
    这篇文章主要为大家展示了“在批处理文件中如何使用参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在批处理文件中如何使用参数”这篇文章吧。sample1:fomat.bat @echo off ...
    99+
    2023-06-09
  • 如何使用关于C#事件处理函数中的参数
    本篇内容介绍了“如何使用关于C#事件处理函数中的参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!是事件源,表示触发事件的那个组件如(but...
    99+
    2023-06-15
  • Spring MVC如何使用@RequestParam注解获取参数
    目录使用@RequestParam注解获取参数@RequestParam无法获取参数使用@RequestParam注解获取参数 创建Hello控制器类 package com.c...
    99+
    2022-11-12
  • SpringBoot如何使用RequestBodyAdvice进行统一参数处理
    SpringBoot RequestBodyAdvice参数处理 在实际项目中 , 往往需要对请求参数做一些统一的操作 , 例如参数的过滤 , 字符的编码 , 第三方的解密等等 , ...
    99+
    2022-11-12
  • Feign远程调用Multipartfile参数如何处理
    今天小编给大家分享一下Feign远程调用Multipartfile参数如何处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作