如何在Spring Boot配置文件中忽略表达式校验?
Spring Boot配置含SpEL格式字符启动失败的解决方法
问题场景
某Spring Boot项目因配置项包含特殊格式字符无法启动,相关信息如下:
配置文件 myconfig.properties
password=3#{xxxx|xxxx)?4/xxxxxxx+ABC1}
错误日志
Caused by: org.springframework.expression.ParseException: Expression [3#{xxxx|xxxx)?4/xxxxxxx+ABC1}] @12: Found closing ')' at position 12 without an opening '(' at org.springframework.expression.common.TemplateAwareExpressionParser.skipToCorrectEndSuffix(TemplateAwareExpressionParser.java:194) ~[spring-expression-6.1.4.jar:6.1.4] at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpressions(TemplateAwareExpressionParser.java:107) ~[spring-expression-6.1.4.jar:6.1.4] at org.springframework.expression.common.TemplateAwareExpressionParser.parseTemplate(TemplateAwareExpressionParser.java:66) ~[spring-expression-6.1.4.jar:6.1.4] at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:52) ~[spring-expression-6.1.4.jar:6.1.4] at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:164) ~[spring-context-6.1.4.jar:6.1.4] at org.springframework.beans.factory.support.AbstractBeanFactory.evaluateBeanDefinitionString(AbstractBeanFactory.java:1605) ~[spring-beans-6.1.4.jar:6.1.4] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1377) ~[spring-beans-6.1.4.jar:6.1.4] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353) ~[spring-beans-6.1.4.jar:6.1.4] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:784) ~[spring-beans-6.1.4.jar:6.1.4]
问题:如何忽略表达式校验以避免启动失败?
解决方法
Spring Boot默认会将#{...}识别为SpEL表达式解析,配置中的字符恰好匹配该格式,导致解析报错。以下是三种可行方案:
转义SpEL标识:在配置文件中给
#{前添加反斜杠转义,让Spring按普通字符串处理:password=3\#{xxxx|xxxx)?4/xxxxxxx+ABC1}全局关闭SpEL解析:如果项目不需要使用SpEL功能,可通过配置类禁用表达式解析器:
import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DisableSpELConfig { @Bean public BeanFactoryPostProcessor disableSpELBeanFactoryPostProcessor() { return (ConfigurableListableBeanFactory beanFactory) -> { beanFactory.setBeanExpressionResolver(null); }; } }此方式会完全关闭全局的Bean表达式解析,适合无SpEL需求的场景。
单个属性原始注入:若仅针对该属性处理,可在
@Value中用单引号包裹属性值,并配合#{null}前缀强制按原始字符串注入:@Value("#{null + '3#{xxxx|xxxx)?4/xxxxxxx+ABC1}'}") private String password;该方式仅影响当前属性,不会干扰全局SpEL功能。
内容的提问来源于stack exchange,提问作者yasi
相关产品推荐
相关产品推荐

