2011-01-24 28 views
41

tôi có cấu hình của tôi:Không thể giải quyết mùa xuân bất động sản placeholder

<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> 

tôi nhận được lỗi

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 

Tôi biết tập tin này thuộc tính có thể bị mất tích, nhưng tôi có nó trong classpath của tôi vừa phải . Cái gì còn thiếu?

web.xml của tôi:

<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> 

Trả lời

3

Tôi vẫn tin mình phải làm gì với các đạo cụ File không được nằm vào mùa xuân. Thực hiện kiểm tra nhanh bằng cách chuyển các tham số dưới dạng tham số jvm. tức là -Didm.url = ....

+0

Tôi không quen với thông số jvm – mjgirl

+0

@mjgirl không khó như vậy: '-Dkey = value' có nghĩa là đặt thuộc tính Hệ thống là" khóa "thành" giá trị " –

+0

Bạn có nghĩa là tôi viết rằng thuộc tính tệp – mjgirl

13

vị trí tập tin bất động sản của bạn là classpath:idm.properties

này là khá bất thường, nó có nghĩa là idm.properties phải được bố trí hoặc ở cấp cao nhất của WEB-INF/classes hoặc tại từ trên mức độ của một trong các lọ bên trong WEB-INF/lib. Thông thường, thực hành tốt là sử dụng một thư mục dành riêng cho các thuộc tính hoặc giữ chúng gần với các tệp ngữ cảnh sử dụng chúng.

Vì vậy, đề xuất của tôi là: Tệp thuộc tính của bạn có thể nằm cạnh tệp ngữ cảnh của bạn không? Nếu vậy, nó không phải trên classpath (xem câu hỏi này: Is WEB-INF in the CLASSPATH?).

Các classpath: bản đồ tiền tố để một ClassPathResource, nhưng có thể bạn cần một ServletContextResource, và bạn sẽ nhận được rằng từ một WebApplicationContext sử dụng cú pháp không tiền tố:

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

tham khảo:

+6

Trong ví dụ về petclinic Spring, chúng đặt các thuộc tính trong src/main/resources và sau đó tham chiếu chúng qua classpath: app.properties. – blahdiblah

11

Đó chắc chắn không phải là một vấn đề với propeties tập tin không được tìm thấy, vì trong trường hợp đó một ngoại lệ được ném.

Đảm bảo rằng bạn thực sự có giá trị bằng khóa idm.url trong số idm.properties.

+0

Tôi đã sao chép các tùy chọn VM từ tập lệnh khởi động của mình để chúng được thêm vào trước với "-D". Nó đã không xảy ra với tôi để kiểm tra điều này rõ ràng ... Cảm ơn! – delucasvb

95

Bạn có thể có nhiều hơn một org.springframework.beans.factory.config.PropertyPlaceholderConfigurer trong đơn đăng ký của mình. Hãy thử đặt một điểm ngắt trên phương thức setLocations của lớp cha và xem liệu nó có được gọi nhiều lần khi khởi động ứng dụng hay không. Nếu có nhiều hơn org.springframework.beans.factory.config.PropertyPlaceholderConfigurer, bạn có thể cần phải xem xét định cấu hình thuộc tính ignoreUnresolvablePlaceholders để ứng dụng của bạn khởi động sạch sẽ.

+7

Tôi đã nhập một ngữ cảnh ứng dụng từ một ngữ cảnh khác và mỗi ngữ cảnh trong số đó có một vị trí thuộc tính sở hữu riêng. Đã cho tôi giờ cố gắng để tìm ra nó (tôi đã có ngoại lệ tương tự xảy ra) và thiết lập ignoreUnresolvablePlaceholders để đúng trong bối cảnh ứng dụng hàng đầu đã làm các trick. Cảm ơn bạn đã viết câu trả lời này! – forhas

+0

Cùng một vấn đề ở đây chỉ trong trường hợp của tôi, tôi đã có một ppc trong xml và dường như tạo một cái khác bằng cách sử dụng chú thích @PropertySource ở nơi khác. tôi đã loại bỏ chú thích và truyền cả hai tệp đạo cụ vào bean ppc trong xml và viola. cảm ơn vì tiền hỗ trợ. – dev

+0

Vì vậy, đơn giản, nhưng giải pháp mạnh mẽ như vậy để giải quyết tất cả các vấn đề với cấu hình trình giữ chỗ! – Cherry

-6

Đảm bảo 'idm.url' được thiết lập trong tập tin bất động sản và các tập tin bất động sản được nạp

1

đảm bảo tài sản của bạn tập tin tồn tại trong thư mục classpath nhưng không có trong thư mục con của thư mục classpath của bạn. nếu nó tồn tại trong thư mục con thì hãy viết như sau classpath: subfolder/idm.các thuộc tính

Các vấn đề liên quan