如何在Spring Boot中从激活profile获取配置值并在Service类使用
错误原因
@Value注解不支持标注在方法内部的局部变量上,仅能用于Spring容器管理Bean的成员变量、构造方法参数、Setter方法参数等位置,所以你写在方法内会报错。- 你之前写的
@Value("${spring.profiles.active:unknown}")是读取当前激活的profile名称,并不是你需要的max-attempts重试最大次数配置。
Spring会自动根据当前激活的profile加载对应的配置文件,不需要你手动读取profile名称去获取配置,直接注入目标配置键即可,下面是两种常用的实现方案:
方案1:成员变量注入@Value(简单场景推荐)
直接在你的Service类中声明成员变量,用@Value注入目标配置:
@Service public class 你的Service类名 { // 注入重试最大次数配置,冒号后面是读取不到配置时的默认值 @Value("${spring.rabbitmq.listener.simple.retry.max-attempts:2}") private int maxAttempt; // 你的业务方法直接使用上面注入的maxAttempt变量即可 public boolean validateRetryAttempts(EmailDto email) { if (!maxRetryAttempts.containsKey(email.getEmail())) { maxRetryAttempts.put(email.getEmail(), 1); } else { if ((maxRetryAttempts.get(email.getEmail()) + 1) >= maxAttempt) { maxRetryAttempts.put(email.getEmail(), maxRetryAttempts.get(email.getEmail()) + 1); return true; } else { maxRetryAttempts.put(email.getEmail(), maxRetryAttempts.get(email.getEmail()) + 1); } } return false; } }
方案2:@ConfigurationProperties批量注入同前缀配置(多配置场景推荐)
如果你需要用到多个rabbitmq重试相关的配置,用配置类批量读取更易维护:
- 首先定义配置类:
import org.springframework.boot.context.properties.ConfigurationProperties; import java.time.Duration; @ConfigurationProperties(prefix = "spring.rabbitmq.listener.simple.retry") public class RabbitRetryProperties { private boolean enabled; private Duration initialInterval; private int maxAttempts; private Duration maxInterval; private int multiplier; // 此处省略所有属性的getter、setter方法 }
- 在启动类或者任意配置类上添加注解开启配置属性扫描:
@EnableConfigurationProperties(RabbitRetryProperties.class) @SpringBootApplication public class 你的启动类名 { public static void main(String[] args) { SpringApplication.run(你的启动类名.class, args); } }
- 在Service中注入配置类使用:
@Service public class 你的Service类名 { private final RabbitRetryProperties retryProperties; // Spring 4.3+之后单构造方法不需要加@Autowired public 你的Service类名(RabbitRetryProperties retryProperties) { this.retryProperties = retryProperties; } public boolean validateRetryAttempts(EmailDto email) { int maxAttempt = retryProperties.getMaxAttempts(); // 剩余业务逻辑和之前一致 if (!maxRetryAttempts.containsKey(email.getEmail())) { maxRetryAttempts.put(email.getEmail(), 1); } else { if ((maxRetryAttempts.get(email.getEmail()) + 1) >= maxAttempt) { maxRetryAttempts.put(email.getEmail(), maxRetryAttempts.get(email.getEmail()) + 1); return true; } else { maxRetryAttempts.put(email.getEmail(), maxRetryAttempts.get(email.getEmail()) + 1); } } return false; } }
内容的提问来源于stack exchange,提问作者Alyan Ahmed
相关产品推荐
相关产品推荐

