使用AOP解决属性值为空,对为空属性赋值问题

问题起因:

之前开发微信公众号使用的是单个公众号,最近需要配置多个公众号,但是又不大规模更改之前写的代码,所以想在获取微信公众号配置信息时,添加默认的配置信息。

开发微信公众号使用的sdk是

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>4.4.0</version>
</dependency>

 具体的可以查看相关demo,demo中的写法是支持多公众号的 :weixin-java-mp-demo-springboot: 基于Spring Boot 和 WxJava 实现的微信公众号Java后端Demo,支持多公众号

前面说了因为刚开始是单公众号所以稍微修改了一下,导致现在多公众号的使用需要赋予默认值,不然公众号配置信息会报错,或者前后端都需要更改,费时费力。

解决方案:

最后决定使用Spring AOP切面配合注解的方式来解决赋值问题。

注解:

import java.lang.annotation.*;

/**
 * 用于给类的属性wxService赋予默认值的注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WxService {
}

AOP切面:

import java.lang.reflect.Field;

/**
 * 对被@WxService修饰的方法所属对象进行属性赋值
 */
@Aspect
@Component
@Slf4j
public class WxServiceAspect {

    @Around(value = "@annotation(WxService)")
    public Object AfterThrowing(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        //log.info("默认赋值第一个公众号信息");
        //获取被代理的对象
        Object target = proceedingJoinPoint.getTarget();
        //获取被代理对象的类型
        Class aClass = target.getClass();
        //通过反射获取属性数组
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            //设置允许访问
            field.setAccessible(true);

            //判断属性数组中是否是类型WxMpService的属性
            if (field.get(target) instanceof WxMpService){
                //获取代理对象的属性值
                WxMpServiceImpl o = (WxMpServiceImpl)field.get(target);
                //将该属性值进行赋值
                WxMpService wxMpService =o;
                //如果wxService获取不到配置信息默认添加第一条配置的信息
                if (wxMpService.getWxMpConfigStorage()==null) {
                    wxMpService.switchover(WxConfigIndexEnum.LIE_R_BABY_SERVICE.getValue());
                }
                //将值放入属性中
                field.set(target,wxMpService);
            }
        }

        return proceedingJoinPoint.proceed();
    }
}

 最后在需要对WxMpService类型的属性赋予默认值的方法上加上@WxService注解即可。

原本想把注解加到类上,在Controller类创建时赋值,这样可以就不担心是否有遗漏的方法未加注解了。

但是将注解声明为@Target({ElementType.METHOD,ElementType.TYPE}),并加到类上会报错,因时间问题,暂未想到解决方法。

如果有更好的解决方案且愿意分享者请留言,谢谢。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值