springboot整合qq登录<2.读取自定义json配置文件信息>

目录

1.前置要求和授权登录原理
2.读取自定义json配置文件信息
3.获取跳转url和回调的接口
4.使用websocket和前端建立连接
5.对接qq登录的流程

在前面说了qq登录的前置条件和基础流程
本章使用的自定义json的解析对于配置信息的读取
不同于平常的yaml文件配置,使用自定义的注解对于bean的重新写入

需要解析的json文件

{
  "baseConf": {
    "clientId": "你自己的",
    "redirectUri": "你自己的"
  },
  "baseUrl": {
    "webRequestUrl": "https://graph.qq.com/oauth2.0/authorize",
    "callbackAddress": "http://chenyp.top/second_hand/qq/qqLogin",
    "getTokenUrl": "https://graph.qq.com/oauth2.0/token",
    "getOpenidUrl": "https://graph.qq.com/oauth2.0/me",
    "getInfoUrl": "https://graph.qq.com/oauth2.0/get_user_info",
    "refreshTokenUrl": "https://graph.qq.com/oauth2.0/token"
  }
}

定义一个注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface MyConfigurationJson {
    @AliasFor("prefix")
    String value() default "";

    @AliasFor("value")
    String prefix() default "";
}

定义映射类

配置类

package top.chenyp.qqService.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import top.chenyp.qqService.annotation.MyConfigurationJson;

@Component
@MyConfigurationJson(prefix = "baseConf")
public class QQBaseConfig {

    private String clientId;
    private String redirectUri;
    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public String getRedirectUri() {
        return redirectUri;
    }

    public void setRedirectUri(String redirectUri) {
        this.redirectUri = redirectUri;
    }

    @Override
    public String toString() {
        return "QQBaseConfig{" +
                "clientId='" + clientId + '\'' +
                ", redirectUri='" + redirectUri + '\'' +
                '}';
    }
}

url类

@Component
@MyConfigurationJson(prefix = "baseUrl")
public class QQBaseUrl {
    private String webRequestUrl;
    private String callbackAddress;
    private String getTokenUrl;
    private String getOpenidUrl;
    private String getInfoUrl;
    private String refreshTokenUrl;

    public String getWebRequestUrl() {
        return webRequestUrl;
    }

    public void setWebRequestUrl(String webRequestUrl) {
        this.webRequestUrl = webRequestUrl;
    }

    public String getCallbackAddress() {
        return callbackAddress;
    }

    public void setCallbackAddress(String callbackAddress) {
        this.callbackAddress = callbackAddress;
    }

    public String getGetTokenUrl() {
        return getTokenUrl;
    }

    public void setGetTokenUrl(String getTokenUrl) {
        this.getTokenUrl = getTokenUrl;
    }

    public String getGetOpenidUrl() {
        return getOpenidUrl;
    }

    public void setGetOpenidUrl(String getOpenidUrl) {
        this.getOpenidUrl = getOpenidUrl;
    }

    public String getGetInfoUrl() {
        return getInfoUrl;
    }

    public void setGetInfoUrl(String getInfoUrl) {
        this.getInfoUrl = getInfoUrl;
    }

    public String getRefreshTokenUrl() {
        return refreshTokenUrl;
    }

    public void setRefreshTokenUrl(String refreshTokenUrl) {
        this.refreshTokenUrl = refreshTokenUrl;
    }

    @Override
    public String toString() {
        return "QQBaseUrl{" +
                "webRequestUrl='" + webRequestUrl + '\'' +
                ", callbackAddress='" + callbackAddress + '\'' +
                ", getTokenUrl='" + getTokenUrl + '\'' +
                ", getOpenidUrl='" + getOpenidUrl + '\'' +
                ", getInfoUrl='" + getInfoUrl + '\'' +
                ", refreshTokenUrl='" + refreshTokenUrl + '\'' +
                '}';
    }
}

最重要的就是对于json加载的解析,并写入bean

实现BeanPostProcessor接口 并重写 postProcessBeforeInitialization的方法

@Component //注意:Bean后置处理器本身也是一个Bean
@Slf4j
public class MyAnnotationBeanPostProcessor implements BeanPostProcessor {
    @SneakyThrows
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        MyConfigurationJson annotation = bean.getClass().getAnnotation(MyConfigurationJson.class);
        if (null == annotation) {
            return bean;
        }
        String prefix = annotation.prefix();
        /**
         * 利用Java反射机制注入属性
         */
        //读取json文件注入bean
        return ReadJson.read("qqConfig",prefix, bean.getClass());
    }
 
    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        return o; //这里要返回o,不然启动时会报错
    }
}

读取json核心方法

public class ReadJson {
    public static Object read(String path,String prefix,Class<?> clazz) throws IOException {
        Resource resource=new ClassPathResource(path+".json");
        InputStream inputStream=resource.getInputStream();
        Map object = JSON.parseObject(inputStream, Map.class);
        String o = object.get(prefix).toString();
        return JSONObject.parseObject(o, clazz);
    }
}

本案例通过运用bean的生命周期的知识,完成了动态的读取json文件并重新对bean进行赋值,最终可以在容器中拿到我们需要的单例对象配置信息,感谢大家的观看!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值