获取不到nacos配置中心的值


package com.tocker.basefile_system.util;

import com.tocker.basefile_system.config.FastDFSClient;
import com.tocker.basefile_system.config.FastDFSConfig;
import org.springframework.beans.factory.annotation.Value;

public class FileUtil {
    private static String connect_timeout;
    private static String secret_key;

    @Value("fastdfs.connect_timeout")
    public void setConnect_timeout(String connect_timeout) {
        FileUtil.connect_timeout = connect_timeout;
    }
    
    @Value("fastdfs.connect_timeout")
    public void setSecret_key(String secret_key) {
        FileUtil.secret_key = secret_key;
    }

    private static FastDFSClient client = new FastDFSClient(init());
    
    //获取单例的client
    public FastDFSClient getInstance() {
        return client;
    }
    
    //初始化文件系统
    private static FastDFSConfig init() {
        FastDFSConfig config = new FastDFSConfig();
        config.setConnect_timeout(connect_timeout);
        config.setSecret_key(secret_key);
        return config;
    }
}

TechWhizKid参考GPT回答:

  1. 配置文件中没有这两个属性:fastdfs.connect_timeoutfastdfs.secret_key

  2. @Value 注解的使用错误:正确的使用方法应该是 @Value("${fastdfs.connect_timeout}") 而不是 @Value("fastdfs.connect_timeout")。你需要在属性名的前后添加 ${},以指示 Spring 从配置文件中获取对应的值。

  3. FileUtil 类可能没有被 Spring 管理,如果一个类没有被 Spring 管理,那么它就不能使用 Spring 的功能,例如 @Value 注解。你可以通过添加 @Component@Service 注解来使 Spring 管理这个类。

  4. FileUtil 类中的 client 字段在类加载时就会被初始化。这个时候,Spring 可能还没有来得及注入 connect_timeoutsecret_key。这种情况下,你需要将 client 的初始化放到一个由 Spring 调用的方法中,例如一个 @PostConstruct 方法。

针对以上问题,以下是我对你的代码的建议:

package com.tocker.basefile_system.util;

import com.tocker.basefile_system.config.FastDFSClient;
import com.tocker.basefile_system.config.FastDFSConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class FileUtil {
    @Value("${fastdfs.connect_timeout}")
    private String connect_timeout;
    
    @Value("${fastdfs.secret_key}")
    private String secret_key;

    private FastDFSClient client;

    @PostConstruct
    public void init() {
        FastDFSConfig config = new FastDFSConfig();
        config.setConnect_timeout(connect_timeout);
        config.setSecret_key(secret_key);
        client = new FastDFSClient(config);
    }

    //获取单例的client
    public FastDFSClient getInstance() {
        return client;
    }
}
  • 这样的修改可以解决你的问题。在这个版本中,把 FileUtil 类声明为一个 Spring 组件,并把 client 的初始化移动到了一个 @PostConstruct 方法中。在这个方法中,connect_timeoutsecret_key 应该已经被正确地注入了。此外,也修复了 @Value 注解的使用错误。

@Value中的值少了${},修改如下:

@Value("${fastdfs.connect_timeout}")
private String connect_timeout;
@Value("${fastdfs.secret_key}")
private String secret_key;

基于new bing部分指引作答:
从代码中看,您正在尝试从Nacos配置中心获取值,并将其用于初始化FastDFSClient。然而,您的代码中的注解使用方式是错误的。以下是正确的代码示例:

import com.alibaba.nacos.api.config.annotation.NacosValue;

public class FileUtil {
    private static String connect_timeout;
    private static String secret_key;

    @NacosValue(value = "${fastdfs.connect_timeout}", autoRefreshed = true)
    public void setConnect_timeout(String connect_timeout) {
        FileUtil.connect_timeout = connect_timeout;
    }
    
    @NacosValue(value = "${fastdfs.secret_key}", autoRefreshed = true)
    public void setSecret_key(String secret_key) {
        FileUtil.secret_key = secret_key;
    }

    private static FastDFSClient client = new FastDFSClient(init());
    
    //获取单例的client
    public FastDFSClient getInstance() {
        return client;
    }
    
    //初始化文件系统
    private static FastDFSConfig init() {
        FastDFSConfig config = new FastDFSConfig();
        config.setConnect_timeout(connect_timeout);
        config.setSecret_key(secret_key);
        return config;
    }
}

请确保您的项目中已正确引入Nacos相关的依赖,并且已正确配置了Nacos服务的地址、命名空间以及配置项(fastdfs.connect_timeout和fastdfs.secret_key)。当配置项的值发生变化时,Nacos会自动更新注解标注的字段值。

@Value 注解里面,需要使用 el 表达式,可以有两种方式:@Value("#{名称}"),另一种是使用@Value("${名称}")

参考:
1、确保nacos配置中心的值已经存在,并且正确地配置了属性
2、确保在使用@Value注解时,属性名称是正确的。在代码示例中,你使用了相同的属性名称"fastdfs.connect_timeout"两次。这可能会导致其中一个值被覆盖,从而导致问题。请确保每个属性的名称都是唯一的。
3、确保在使用@Value注解时,属性值没有被占用
4、确保在使用@Value注解时,类路径是正确的

  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:获取不到nacos配置中心的配置信息(已解决)
  • 除此之外, 这篇博客: 无法获取到Nacos配置中心的配置问题中的 总结 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这是一个非常细节的问题,我原先以为我们把 Nacos 的配置信息写在默认的 application.yml 文件中就可以加载,但是事实并非如此,Nacos 的配置信息必须写在 bootstrap.properties 或者 bootstrap.yml 文件中,以后要多加注意!

1楼的答案是正解。

@Value("${fastdfs.connect_timeout}")
private static String connect_timeout; 
@Value("${fastdfs.secret_key}")
private static String secret_key;