栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring AOP 无法拦截方法 拦截后获取参数却为空.

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring AOP 无法拦截方法 拦截后获取参数却为空.

起因: 项目重构, 期间要拦截请求加日志, 后期日志处理得到数据. 但是一部分内容是MQ推过来的, 发现推过来的部分拦截不到, 如: send发送内容, this.send(xxx)直接发送, send的日志无法拦截.

解决方案: 使用spring填充的类进行调用, MaapSendController 类内增加MaapSendController 的@Autowired实例, 使用该实例可以被AOP拦截到.

 
    @Autowired
    private MaapSendController maapSendController;

    
    @Autowired
    private MQMessageListener listenerConcurrently;

    
    @Autowired
    @Qualifier("DefaultMQProducer")
    private DefaultMQProducer DefaultMQProducer;

    
    @PostConstruct
    public void registryListener(){
//        DisableSSLCertificateCheckUtil.disableChecks();
        listenerConcurrently.addListener((msgs, context) -> {
            for(MessageExt msg : msgs) {
                try {
                    String topic = msg.getTopic();
                    log.info("topic = " + topic);
                    byte[] body = msg.getBody();
                    log.info("body:  " + new String(body));
                    String keys = msg.getKeys();
                    log.info("keys = " + keys);
                    String tags = msg.getTags();
                    log.info("tags = " + tags);
                    String bodyJson = new String(body);
                    Message5gSend bodyObj = JSONUtil.toBean(bodyJson, Message5gSend.class, false);
                    maapSendController.send(bodyObj);
                }catch (Exception e){
                    log.error("消息消费失败: {}", e.getMessage());
                }
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
    }

但是这样拦截的时候发现send的参数在拦截的时候getArgs()是Null, 但是我断点的时候却发现point内的methodInvocation内是有参数内容的, 看MethodInvocationProceedingJoinPoint的源码内的getArgs也是能够从这里存在的位置获取参数的. 于是我尝试把point转换为MethodInvocationProceedingJoinPoint后再次getArgs(), 就特么出来了....看来类型下转后getArgs的实现跟着有变化.

    
    //MethodInvocationProceedingJoinPoint的源码

	@Override
	public Object[] getArgs() {
		if (this.args == null) {
			this.args = this.methodInvocation.getArguments().clone();
		}
		return this.args;
	}
        // 获取请求参数
        // 获取请求参数
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = null;
        Object[] args = null;
        if(attributes != null) {
            request = attributes.getRequest();
            args = point.getArgs();
        }
        if(args == null){
            // 处理直接调用的情况
            if(point instanceof MethodInvocationProceedingJoinPoint){
                MethodInvocationProceedingJoinPoint miPoint = (MethodInvocationProceedingJoinPoint)point;
                log.info(miPoint.getArgs() + "");
                args = miPoint.getArgs();
                // 转换后使用下级类的getArgs()可以获得内容
            }
        }

问题解决, 无法拦截的问题网上有解决方案, 但是无参数的问题完全没发现有相关文章. 找到问题写篇文章做点贡献.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/716752.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号