首页 > 解决方案 > 在控制器初始化问题期间使用@Value Spring 注释

问题描述

可能其他人也可能问过类似的问题,但是我找不到提供有效解决方案的答案...我正在学习弹簧靴,而在我的实验中我正在玩番石榴 RateLimiter遇到以下问题:需要在控制器初始化期间创建 RateLimiter,但是如果我想加载速率,我必须对其进行硬编码,因为如果我尝试使用带有 @Value Spring 注释的属性从道具加载它,它就不起作用. 这个“限制”有什么“技巧”吗?见下面的代码:

@RestController
public class LoggingController {
    private Logger logger = LoggerFactory.getLogger(LoggingController.class);

    @Value("${count}")
    private Double PERMITS_COUNT;
    @Value("${seconds}")
    private Double PERMITS_PER_SECONDS;
    @Value("${consumed}")
    private int PERMITS_CONSUMED;

//@ Value fails here with NullPointerException
    private RateLimiter rateLimiter = RateLimiter.create(PERMITS_COUNT / PERMITS_PER_SECONDS);
// This works file
private RateLimiter rateLimiter = RateLimiter.create(10d / 60d);

    private AtomicInteger index = new AtomicInteger(0);


    @GetMapping("/logging")
    @ResponseBody
    public String logging (@RequestParam(name="name", required=false, defaultValue="JavaBoss") String name) {

//@Value works fine if used here
        rateLimiter.setRate(PERMITS_COUNT / PERMITS_PER_SECONDS);
        rateLimiter.acquire(PERMITS_CONSUMED);
...

提前谢谢了...

标签: spring-bootguava

解决方案


使用 PostConstruct,你应该没问题

 @RestController
    public class LoggingController {
        private Logger logger = LoggerFactory.getLogger(LoggingController.class);
    
        @Value("${count}")
        private Double PERMITS_COUNT;
        @Value("${seconds}")
        private Double PERMITS_PER_SECONDS;
        @Value("${consumed}")
        private int PERMITS_CONSUMED;
        
        private RateLimiter rateLimiter;
        
        @PostConstruct 
        private void createRateLimiter() {
         rateLimiter = RateLimiter.create(PERMITS_COUNT / PERMITS_PER_SECONDS);
        }
        
    
        private AtomicInteger index = new AtomicInteger(0);
    
    
        @GetMapping("/logging")
        @ResponseBody
        public String logging (@RequestParam(name="name", required=false, defaultValue="JavaBoss") String name) {
    
    
    ...

推荐阅读