Spring @Value 默认无法计算表达式

问题描述 投票:0回答:1

我需要根据指定的属性或可用资源为计划任务设置线程池大小。 所以,我写了以下代码:

@EnableScheduling
@Configuration

    public class TaskScheduler{
    
        @Value("${thread.pool.size:#{Runtime.getRuntime().availableProcessors() - 1}}")
        private int treadPoolSize;
    
        @Autowired
        TaskDataRepository repository;
        ...
    }

但是,当我开始编写代码时,我得到了

2024-01-31 11:59:04.217 [元数据-DEV] [主要] [警告] o.s.c.a.AnnotationConfigApplicationContext :%PARSER_ERROR[enc] 2024-01-31 11:59:04.231 [元数据-DEV] [主要] [信息] o.s.b.a.l.ConditionEvaluationReportLogger:%PARSER_ERROR[enc] 2024-01-31 11:59:04.259 [元数据-开发] [主要] [错误] o.s.boot.SpringApplication : %PARSER_ERROR[enc] org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名称为“taskScheduler”的 bean 时出错:依赖关系不满足 通过字段“treadPoolSize”表示:表达式解析失败于 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:772) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:752) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:145)

有人可以指出我的表达有什么问题吗? 谢谢。

spring-boot expression default-value spring-annotations
1个回答
0
投票

SpEL 语法

#{}
不能在属性占位符语法
${}
中使用。然而,相反的情况也是可能的,因为 SpEL 更加复杂和强大。

@Value("#{${thread.pool.size}?:T(Runtime).getRuntime().availableProcessors() - 1}")
private int threadPoolSize;

${thread.pool.size}
- 使用占位符语法读取属性。

?:
- Elvis Operator 检查属性是否为 null 或为空。

T(Runtime).getRuntime().availableProcessors() - 1
- T 运算符 获取对
Runtime
类型的引用。

© www.soinside.com 2019 - 2024. All rights reserved.