【问题解决】jasypt-spring-boot-starter导致apollo动态配置刷新失效

简介: 【问题解决】jasypt-spring-boot-starter导致apollo动态配置刷新失效

背景


1.项目中关于数据库密码等信息想要进行加密处理,所以引入了jasypt-spring-boot-starter,版本3.0.3


2.后来项目接入了apollo的动态配置中心,apollo-client-config-data版本1.9.1


3.此时发现@Value的值,不能进行动态刷新,当发布新配置时,apollo会进行更新操作,可是程序里仍旧是旧值


4.通过查看文件,可以看到本地拉下来的配置文件中,值已经同步成和apollo配置中心一样。


原因


这块我理解的还不够透彻,大家可以看一下apollo的这个issues,等我研究明白了我再写,先看这个吧


apollo跟jasypt-spring-boot-2.1.0.jar不兼容


解决方案


方案一


高版本jasypt会有这个问题,其他博客说1.18/1.16版本可以用,应该是2.0.0以下的都可以,我尝试没成功,大家也可以参考一下。


方案二


照着issues里的方案整了一版,但是不太稳定,还没搞明白为啥,但是能用,直接上代码:


@Order(-12312931)
public class ApolloConfigChangeListener implements ConfigChangeListener {
    public ApolloConfigChangeListener() {
    }
    @Override
    public void onChange(ConfigChangeEvent changeEvent) {
        changeEvent.changedKeys().forEach(k -> {
            this.refresh();
        });
    }
    public void refresh() {
        refreshCachedProperties();
    }
    private void refreshCachedProperties() {
        ConfigurableApplicationContext context = (ConfigurableApplicationContext) SpringContextUtil.getApplicationContext();
        PropertySources propertySources = context.getEnvironment().getPropertySources();
        propertySources.forEach(this::refreshPropertySource);
    }
    @SuppressWarnings("rawtypes")
    private void refreshPropertySource(PropertySource<?> propertySource) {
        if (propertySource instanceof CompositePropertySource) {
            CompositePropertySource cps = (CompositePropertySource) propertySource;
            cps.getPropertySources().forEach(this::refreshPropertySource);
        } else if (propertySource instanceof EncryptablePropertySource) {
            EncryptablePropertySource eps = (EncryptablePropertySource) propertySource;
            eps.refresh();
        }
    }
}


为此还写了个工具类:


public class SpringContextUtil {
    private static ApplicationContext applicationContext;
    //获取上下文
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    //设置上下文
    public static void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtil.applicationContext = applicationContext;
    }
    //通过名字获取上下文中的bean
    public static Object getBean(String name){
        return applicationContext.getBean(name);
    }
    //通过类型获取上下文中的bean
    public static Object getBean(Class<?> requiredType){
        return applicationContext.getBean(requiredType);
    }
}


然后启动类也要做修改,修改main方法:


    public static void main(String[] args) {
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
        ApplicationContext context = SpringApplication.run(BmsWebApplication.class, args);
        SpringContextUtil.setApplicationContext(context);
        //这里application.yml是我要关注的apollo里面的那个配置文件
        ConfigService.getConfig("application.yml")
                .addChangeListener(new ApolloConfigChangeListener());
    }


总结


经过以上修改,配置是能实时更新的,可是不太稳定,偶尔会出现值没更新的情况,此时多改几次就可以了,我还没搞清楚为什么,希望有比较懂的大神评论告诉我,感谢

目录
相关文章
|
2天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
13 0
|
29天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
39 4
|
26天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
34 0
|
19天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
12天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
24 1
|
28天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
117 1
|
2月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
213 1
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
45 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
79 0
|
1月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
37 0