【问题标题】:use of @Value Spring annotation during Controller initialization issue在控制器初始化问题期间使用@Value Spring 注释
【发布时间】:2021-01-17 21:09:32
【问题描述】:

可能其他人也可能问过类似的问题,但我找不到提供有效解决方案的答案... 我正在学习弹簧靴,当我在实验期间玩番石榴 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-boot guava


    【解决方案1】:

    使用 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) {
        
        
        ...
    

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 2013-04-22
      • 1970-01-01
      • 2010-12-30
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      相关资源
      最近更新 更多