【问题标题】:Could not resolve Spring property placeholder无法解析 Spring 属性占位符
【发布时间】:2011-01-24 07:23:01
【问题描述】:

我有我的配置:

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

<bean id="idmPropertyHolder" class="fi.utu.resurssitilaus.idm.IdmPropertyHolder">
   <property name="url" value="${idm.url}" /> 
    <property name="user" value="${idm.user}" />
    <property name="password" value="${idm.password}" />
    <property name="proxyHost" value="${http.proxyHost}" />
    <property name="proxyPort" value="${http.proxyPort}" />
</bean>

我得到了错误

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'idmPropertyHolder' defined in ServletContext resource [/WEB-INF/idm-config.xml]: Could not resolve placeholder 'idm.url'
            at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:272)
            at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:75)
            at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:640)
            at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:615)
            at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:405)
            at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
            at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
            at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
            at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
            at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
            at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
            at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
            at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
            at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:514)
            at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1288)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
            at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
            at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
            at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1473)
            at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:824)
            at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:350)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:196)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
            at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
            at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
            at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
            at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
            at java.lang.Thread.run(Thread.java:619)
    24.1.2011 9:19:05 org.apache.catalina.core.ApplicationContext log
    INFO: Closing Spring root WebApplicationContext
    24.1.2011 9:19:05 org.apache.catalina.core.ApplicationContext log
    INFO: Shutting down log4j

我知道这可能缺少属性文件,但我的类路径中正好有它。什么不见​​了?

我的 web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      /WEB-INF/base-config.xml
      /WEB-INF/idm-config.xml
      /WEB-INF/ldap-config.xml
      /WEB-INF/sec-config.xml

    </param-value>
  </context-param>

  <!-- Reads request input using UTF-8 encoding -->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>


  <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>


  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
  </listener>

  <!-- Handles all requests into the application -->
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
        /WEB-INF/app-config.xml

      </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>tiles</servlet-name>
    <servlet-class>org.apache.tiles.web.startup.TilesServlet</servlet-class>
    <init-param>
      <param-name>
        org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
      </param-name>
      <param-value>
        /WEB-INF/tiles-config.xml
      </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

  <session-config>
    <session-timeout>
      30
    </session-timeout>
  </session-config>

  <welcome-file-list>
    <welcome-file>redirect.jsp</welcome-file>
  </welcome-file-list>
</web-app>

【问题讨论】:

    标签: spring


    【解决方案1】:

    您的应用程序中可能有多个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。尝试在超类的setLocations 方法上设置断点,看看它是否在应用程序启动时被多次调用。如果有多个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,您可能需要查看配置ignoreUnresolvablePlaceholders 属性,以便您的应用程序能够干净启动。

    【讨论】:

    • 我从另一个应用程序上下文导入了一个应用程序上下文,每个应用程序上下文都有自己的属性占位符。我花了几个小时试图弄清楚(我遇到了同样的异常)并在顶部应用程序上下文中将 ignoreUnresolvablePlaceholders 设置为 true 就可以了。感谢您写下这个答案!
    • 同样的问题,仅在我的情况下,我在 xml 中有一个 ppc,显然是通过在其他地方使用 @PropertySource 注释来创建另一个。我摆脱了注释并将两个道具文件传递给xml和viola中的ppc bean。感谢您的提示。
    • 如此简单但功能强大的解决方案,可以解决占位符配置的所有问题!
    • 我遇到了同样的问题,但 ignoreUnresolvablePlaceholders 解决方案无法解决我的问题。是的,我还有一个占位符配置器,但它在我的服务器配置中,仍然阻止读取配置文件。我从服务器配置中删除了占位符配置器,一切正常。谢谢提示。
    【解决方案2】:

    您的属性文件位置是classpath:idm.properties

    这很不寻常,这意味着idm.properties 必须位于WEB-INF/classes 的顶层或WEB-INF/lib 内的一个罐子的顶层。通常最好使用属性的专用文件夹或将它们放在使用它们的上下文文件附近。

    所以我的建议是:你的属性文件可能在你的上下文文件旁边吗?如果是这样,则它不在类路径中(请参阅此问题:Is WEB-INF in the CLASSPATH?)。

    classpath: 前缀映射到 ClassPathResource,但您可能需要 ServletContextResource,您可以使用不带前缀的语法从 WebApplicationContext 中获得:

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

    参考:

    【讨论】:

    • 在 Spring petclinic 示例中,他们将属性放在 src/main/resources 中,然后通过 classpath:app.properties 引用它们。
    【解决方案3】:

    找不到propeties文件绝对不是问题,因为在这种情况下会引发另一个异常。

    确保您在 idm.properties 中确实有一个带有键 idm.url 的值。

    【讨论】:

    • 我已经从我的启动脚本中复制粘贴了 VM 选项,因此它们都以“-D”开头。我没有想到要检查这么明显的东西......谢谢!
    【解决方案4】:

    我仍然认为它与 spring 没有找到 props 文件有关。通过将参数作为 jvm 参数传递来进行快速测试。即 -Didm.url=....

    【讨论】:

    • 我对 jvm 参数不熟悉
    • @mjgirl 没那么难:-Dkey=value 表示将系统属性“key”设置为“value”
    • 你的意思是我把它写到属性文件中
    • @mjgirl 假设您有一个名为“A”的类,其中包含主要方法。您可以像这样将 idm.url 传递给“A”“java -Didm.url=abc.comA”
    【解决方案5】:

    确保您的属性文件存在于类路径目录中,但不存在于类路径目录的子文件夹中。如果它存在于子文件夹中,则编写如下 classpath:subfolder/idm.properties

    【讨论】:

      【解决方案6】:

      以下属性必须添加到 gradle.build 文件中

      processResources {
          filesMatching("**/*.properties") {
              expand project.properties
          }
      }
      
      

      此外,如果使用 Intellij,则必须重新导入项目。

      【讨论】:

        【解决方案7】:

        确保在属性文件中设置了“idm.url”并加载了属性文件

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-21
          • 2016-07-24
          • 2018-02-20
          • 2017-05-01
          • 1970-01-01
          • 2015-05-22
          相关资源
          最近更新 更多