【问题标题】:Using @Value to inject property to constructor, SpelEvaluationException: EL1008E (4.1.6)使用@Value 向构造函数注入属性,SpelEvaluationException: EL1008E (4.1.6)
【发布时间】:2015-08-02 18:06:46
【问题描述】:

我阅读了一篇关于使用 facebook 进行身份验证的帖子,http://www.jasha.eu/blogposts/2013/09/retrieve-facebook-profile-data-java-spring-social.html

他使用 autowired 向构造函数注入 3 个参数。这给了我 SpelEvaluationException。

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

facebook.clientId=237473571343

facebook.clientSecret=9iuwijig[sa[w90u2tjgjgj

application.host=http://localhost:8080

和构造函数

@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);
  }
}

搜索和阅读讨论和文档后,我仍然不知道该怎么做。

  1. #{}是spring EL支持的,不知道怎么用,不知道和${}的区别
  2. 如果我改成@Value("${facebook.clientId}"),不会有异常,然后我用debug模式读取clientId的值,它不显示237473571343,它显示${facebook. clientId},它工作正常吗?

【问题讨论】:

  • 刚刚测试过,facebook 给了我无效的应用程序 ID ${facebook.clientId},所以从 # 更改为 $ 不起作用。我想我遗漏了一些东西,spring 没有将我的属性文件识别为 bean。
  • 如果你没有*PlaceHolderConfigurer 什么都不会发生,也只是拍打一个属性文件以使其无法加载。向我们展示一些配置。此外,如果您使用的是 maven,则该文件应位于 src/main/resources 而不是 src
  • 你是对的,我想我没有 PlaceHolderConfigurer,我的代码在添加 到 servlet.xml 后工作.但是我不知道util:properties和PlaceHolderConfigurer的区别,它们是一样的吗?
  • 不,它们不是,它不应该与它一起工作,除非你将它命名为properties。您应该改用<context:properties-placeholder />
  • Deinum 的答案是正确的。不知道如何回答。

标签: spring spring-annotations spring-el spring-java-config


【解决方案1】:
@Value("#{properties['facebook.clientId']}") 

在您的 @Value 注释中,您使用的是 SpEL 表达式。在您的情况下,它将查找名为 propertiesMapProperties 对象,并尝试使用键 facebook.clientId 查找属性。

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

<util:properties id="properties" location="config.properties" />

虽然这可行,但我强烈建议使用 *PlaceHolderConfigurer 而不是使用 SpEL.First add atag to your configuration, next change your@Value` 来简单地使用属性。

<context:property-placeholder location="config.properties" />

那么你的@Value可以像

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多