我想在application.properties中计算我的端口号,如下所示:
server.port=#{ 1 + ${myapp.web.server.port.ssl} }
myapp.web.server.port.ssl=8300
但是当我启动Spring Boot应用程序时,我得到的只是一个execption。
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.lang.String to type java.lang.Integer]
reference guide的数学运算符部分表明它应该有效,但事实并非如此。
在Spring内部,它可以调用:
GenericConversionService.convert("#{ 1 + 8300 }", java.lang.String, java.lang.Integer)
但是没有逻辑可以识别它的SpEL。它就像它根本没有认识到它的SpEL一样。但是,如果我将表达式更改为#{ n1 + ${myapp.web.server.port.ssl} }
,那么我会得到以下异常,表明它被评估为SpEL:
SpelEvaluationException: EL1008E:(pos 0): Property or field 'n1' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public?
如何让SpEL为另一个属性的值添加一个?
更新
我找到了similar question,所以我尝试了类似的方法:
server.port =#{T(java.lang.Integer).parseInt('$ {fire.web.server.port.ssl}')+ 1}
但那仍然行不通。由于某种原因,它不会将其视为SpEL表达式。但如果存在语法错误,是否会将其视为SpEL表达式!
答案 0 :(得分:1)
您只能从配置中执行此操作,但不能从属性执行此操作:
<bean class="...">
<property name="port" value="#{1 + ${myapp.web.server.port.ssl}}"/>
</bean>
答案 1 :(得分:1)
我认为问题是${myapp.web.server.port.ssl}
被评估为String
,尝试这样的事情
#{1 + new Integer(props['myapp.web.server.port.ssl'])}
其中props
是包含您的属性的bean。