当前位置: 首页 > 知识库问答 >
问题:

在Spring的@value注释中可以指定多个属性名吗?

屈浩波
2023-03-14

项目的属性文件

foo.bar=value

项目的配置类

@Configuration
public class MyConfig {
    @Value("${foo.bar}")
    private String myValue;
}

然而,我正在尝试使用条件配置创建一个SpringBoot starter项目,并希望将属性名称标准化为一些有用的东西,如“com.mycompany.propertygroup.propertyName”,但是为了简化转换并鼓励采用,我还希望在一段时间内支持旧的属性名称,因此我想知道是否有某种方法允许多个属性名称设置同一个字段?例如:

@Configuration
public class MyConfig {
    @Value("${com.mycompany.propertygroup.propertyname}" || "${oldconvention.property}")
    private String myValue;
}
oldconvention.property=value
com.mycompany.propertygroup.propertyname=value

虽然提供的SpEL表达式答案在两个属性都存在时有效,但当只有一个属性名存在时,应用程序上下文无法加载。示例:

更新的配置类

@Value("#{'${com.mycompany.propertygroup.propertyname}' != null ? '${com.mycompany.propertygroup.propertyname}' : '${oldconvention.propertyname}'}"
private String myProperty;

更新的属性文件

com.mycompany.propertygroup.propertyname=somevalue
Caused by: java.lang.IllegalArgumentException: 
Could not resolve placeholder 'oldconvention.propertyname' in value
"#{'${com.mycompany.propertygroup.propertyname}' != null ? '${com.mycompany.propertygroup.propertyname}' : '${oldconvention.propertyname}'}"
@Value("#{${com.mycompany.propertygroup.propertyname:null} != null ? '${com.mycompany.propertygroup.propertyname}' : '${oldconvention.propertyname}'}")
private String myProperty;
@Value("#{${com.mycompany.propertygroup.propertyname:null} != null ? '${com.mycompany.propertygroup.propertyname:}' : '${oldconvention.propertyname:}'}")
private String myProperty;

当使用默认的属性表示法时,我不断地得到这样的错误:

org.springframework.expression.spel.SpelParseException: 
EL1041E: After parsing a valid expression, there is still more data in the expression: 'colon(:)'

当我在谷歌上搜索这个错误时,流行的答案是属性必须用单引号包装,这样它们的计算结果就成了字符串...但是它们已经包装好了(除了第一个...我必须打开那个,因为我希望它的计算值为null检查的文字null)。所以我在想,当属性被包装在咒语表达式中时,默认值不能与属性一起使用。事实上,我只在@value注释中设置了纯属性持有者时才会设置默认属性,而且我所见过的SpEL表达式中使用的所有属性都没有默认设置。

共有1个答案

冯枫
2023-03-14

可以使用以下@value注释:

@Configuration
public class MyConfig {

    @Value("#{'${com.mycompany.propertygroup.propertyname:${oldconvention.propertyname:}}'}")
    private String myValue;
}

@value注释如果提供了com.mycompany.propertygroup.propertyname,则使用com.mycompany.propertygroup.propertyname,如果没有提供com.mycompany.propertyname,则默认为如果两者都没有提供,则属性设置为null。您可以通过将null替换为另一个所需的值来将此默认值设置为另一个值。

有关更多信息,请参见以下内容:

    null
@Configuration
public class MyConfig {

    @Value("${com.mycompany.propertygroup.propertyname:}")
    private String newValue;

    @Value("${oldconvention.propertyname:}")
    private String oldValue;

    public String getValue() {

        if (newValue != null && !newValue.isEmpty()) {
            // New value is provided
            System.out.println("New Value: " + newValue);
            return newValue;
        }
        else {
            // Default to the old value
            return oldValue;
       }
    }
}
 类似资料:
  • 我当前有一个来自属性文件的变量,声明为: 在本例中,我希望在注释中使用,而不是硬编码常量“3”: 这有可能吗? 我试过: 但是我得到以下编译错误:

  • 我们一直在使用Spring@Value注释来注入属性值。我们有一个约定来命名属性名称,以匹配它们注入的java字段。这带来了不必要的工作,即每个ConfigBean的java字段都需要用@Value注释。 我正在寻找一种方法,用新的注释注释java类(比如说ConfigBean),让一些后处理器读取这些bean的属性名称,并自动注入属性值。 我正在寻找一些关于如何在没有@Value注释的情况下实现

  • 问题内容: 尝试在Spring 3.0.5.RELEASE中自动将属性连接到Bean ,我正在使用: config.properties: main-components.xml: MyClass: 结果,username被设置为字面值 ,因此表达式不会被解析。我对该类的其他自动关联依赖关系已设置,并且Spring不会引发任何异常。我也尝试添加,但没有帮助。 如果我将属性解析为单独的bean,然后

  • 问题内容: 从属性文件中为最终属性进行Spring注入的一个简单问题。 我有一个属性文件,要在其中存储文件路径。通常,当我使用属性文件时,我会使用类似以下的方法来设置类属性: 然后在我spring.xml我会像这样: 这很好用,很简单,并且使代码简洁美观。但是我不确定在尝试将属性值注入最终类属性时使用的最整洁的模式是什么? 显然是这样的: 不管用。还有另一种方法吗? 问题答案: 将值注入最终字段的

  • 问题内容: 关于从属性文件中为最终属性进行Spring注入的一个简单问题。 我有一个属性文件,要在其中存储文件路径。通常,当我使用属性文件时,我会使用类似以下的方法来设置类属性: 然后在我spring.xml我会像这样: 这样效果很好,很简单,并且使代码更简洁。但是我不确定在尝试将属性值注入最终类属性时使用的最整洁的模式是什么? 显然是这样的: 不管用。还有另一种方法吗? 问题答案: 如果您正在寻