spring boot config类中的@Value 间歇性加载失败解决方案

本文主要讨论了在Spring Boot应用中,@Value注解偶尔出现配置加载失败的问题,特别是在引用spring.redis.timeout时。通过分析启动日志发现,由于spring.profiles.active未正确设置,导致dev配置未能加载。解决方案是在pom.xml文件中添加对应的dev profile配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴一下yml

server:
  port: 8091
  max-http-header-size: 10240
  servlet:
    context-path: /

spring:
  profiles:
    active: dev

再贴一下dev-yml

spring:
  redis:
    host: 127.0.0.1
    port: 7379
    database: 0
    password:
    timeout: 100000
    lettuce:
      pool:
        max-active: 100
        max-idle: 50
        max-wait: 6000
        min-idle: 10

引用@value的代码:

import java.lang.reflect.Method;
import java.time.Duration;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.Resource;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.*;

import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;


@Configuration
public class RedisConfig extends CachingConfigurerSupport {


    @Autowired
    private LettuceConnectionFactory lettuceConnectionFactory;

    @Value("${spring.redis.timeout}")
    private Long timeToLive;

    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuffer sb = new StringBuffer();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }


    // 缓存管理器
    @Bean
    public CacheManager cacheManager() {
        //关键点,spring cache的注解使用的序列化都从这来,没有这个配置的话使用的jdk自己的序列化,实际上不影响使用,只是打印出来不适合人眼识别
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))//key序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))//value序列化方式
                .disableCachingNullValues()
                .entryTtl(Duration.ofSeconds(timeToLive));//缓存过期时间


        RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder
                .fromConnectionFactory(lettuceConnectionFactory)
                .cacheDefaults(config)
                .transactionAware();

        return builder.build();
    }


    /**
     * RedisTemplate配置
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        // 设置序列化
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
                Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
        om.enableDefaultTyping(DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置redisTemplate
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        RedisSerializer<?> stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);// key序列化
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化
        redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    private RedisSerializer<String> keySerializer() {
        return new StringRedisSerializer();
    }

    private RedisSerializer<Object> valueSerializer() {

        //或者使用GenericJackson2JsonRedisSerializer
        return new GenericJackson2JsonRedisSerializer();
    }
}

项目启动时偶尔报错,提示spring.redis.timeout加载不到,偶尔没错,报错时截取部分日志:

2019-05-08 10:27:29.221  INFO 12652 --- [  restartedMain] com.ty.ext.front.FrontApplication        : Starting FrontApplication on DESKTOP-LA7V354 with PID 12652 (F:\tianyuan\svn\ty-ext\trunk\front\target\classes started by Amy in F:\tianyuan\svn\ty-ext\trunk)
2019-05-08 10:27:29.232  INFO 12652 --- [  restartedMain] com.ty.ext.front.FrontApplication        : No active profile set, falling back to default profiles: default
2019-05-08 10:27:29.418  INFO 12652 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 


………………中间省略

Error creating bean with name 'redisConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.redis.timeout' in value "${spring.redis.timeout}"

明显,启动时spring.profiles.active 的值没找到,没有加载dev对应的配置

再看pom.xml中profile的设置,居然没有指定dev,加上就好了,如下:

<profile>
            <id>dev</id>
            <properties>
                <spring.active>dev</spring.active>
            </properties>
            <repositories>
                <repository>
                    <id>nexus-aliyun</id>
                    <name>Nexus aliyun</name>
                    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值