问题起因:
之前开发微信公众号使用的是单个公众号,最近需要配置多个公众号,但是又不大规模更改之前写的代码,所以想在获取微信公众号配置信息时,添加默认的配置信息。
开发微信公众号使用的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}),并加到类上会报错,因时间问题,暂未想到解决方法。
如果有更好的解决方案且愿意分享者请留言,谢谢。