Spring 使用@Value将属性注入构造函数,SpelEvaluationException:EL1008E(4.1.6)

Spring 使用@Value将属性注入构造函数,SpelEvaluationException:EL1008E(4.1.6),spring,spring-annotations,spring-el,spring-java-config,Spring,Spring Annotations,Spring El,Spring Java Config,我读了一篇关于facebook认证的帖子 他使用autowired向构造函数注入3个参数。这给了我特殊的例外 在我的项目中,我在/src下添加了一个config.properties/ facebook.clientId=237473571343 facebook.clientSecret=9iuwijig[sa[w90u2tjgjgj] application.host= 以及构造器 @Controller public class FacebookSpringSocialAuthentica

我读了一篇关于facebook认证的帖子

他使用autowired向构造函数注入3个参数。这给了我特殊的例外

在我的项目中,我在/src下添加了一个config.properties/

facebook.clientId=237473571343

facebook.clientSecret=9iuwijig[sa[w90u2tjgjgj]

application.host=

以及构造器

@Controller
public class FacebookSpringSocialAuthenticator {
  public static final String STATE = "state";
  private String applicationHost;
  private FacebookConnectionFactory facebookConnectionFactory;

  @Autowired
  public FacebookSpringSocialAuthenticator(
      @Value("#{properties['facebook.clientId']}") 
        String clientId,
      @Value("#{properties['facebook.clientSecret']}") 
        String clientSecret,
      @Value("#{properties['application.host']}") 
        String applicationHost) {
    this.applicationHost = applicationHost;
    facebookConnectionFactory = 
      new FacebookConnectionFactory(clientId, clientSecret);
  }
}
在搜索和阅读讨论和文档之后,我仍然不知道该怎么办

  • {}是spring EL支持,不知道如何使用它,也不知道与${}的区别
  • 如果我更改为@Value(${facebook.clientId}),将不会出现异常,然后我使用调试模式读取clientId的值,它不显示237473571343,它显示${facebook.clientId},是否正常工作
  • @Value
    注释中,您使用的是SpEL表达式。在您的示例中,它将查找名为
    Properties
    Map
    Properties
    对象,并尝试使用键
    facebook.clientId
    查找属性

    要使其工作,您需要添加以下内容

    <util:properties id="properties" location="config.properties" />
    
    那么您的
    @值可以是

    @Value("${facebook.clientId}")
    

    这样做的另一个好处是,您还可以使用系统或环境属性进行一些配置(或覆盖部分配置)。

    刚刚测试过,facebook给了我无效的应用程序id${facebook.clientId},所以从#到$的更改不起作用。我想我缺少了一些东西,spring无法将我的属性文件识别为bean。如果您没有
    *占位符配置器
    ,则什么都不会发生,也只是在无法加载属性文件的情况下将其加载。向我们展示一些配置。如果您使用maven,该文件也应该在
    src/main/resources
    而不是在
    src
    中。你是对的,我认为我没有占位符配置器,我的代码在添加到servlet.xml后可以工作。但是我不知道util:properties和占位符配置器之间的区别,它们是相同的吗?不,它们不是,并且不应该与之一起工作,除非你将其命名为
    properties
    。您应该改用
    。数字答案是正确的。不知道如何使其成为答案。
    <context:property-placeholder location="config.properties" />
    
    @Value("${facebook.clientId}")