Imansible risolvere il segnaposto di proprietà Spring

Ho la mia configurazione:

        

Ottengo l’errore

  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 

So che potrebbe mancare il file delle proprietà, ma ce l’ho nel mio classpath giusto. Che cosa manca?

Il mio web.xml:

  contextConfigLocation  /WEB-INF/base-config.xml /WEB-INF/idm-config.xml /WEB-INF/ldap-config.xml /WEB-INF/sec-config.xml     characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter  encoding UTF-8   forceEncoding true    springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   characterEncodingFilter /*   springSecurityFilterChain /*   org.springframework.web.util.Log4jConfigListener   org.springframework.web.context.ContextLoaderListener   org.springframework.security.web.session.HttpSessionEventPublisher    dispatcher org.springframework.web.servlet.DispatcherServlet  contextConfigLocation  /WEB-INF/app-config.xml   1   tiles org.apache.tiles.web.startup.TilesServlet   org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG   /WEB-INF/tiles-config.xml   2   dispatcher *.html    30    redirect.jsp   

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer tua applicazione potresti avere più di un org.springframework.beans.factory.config.PropertyPlaceholderConfigurer . Prova a impostare un punto di interruzione sul metodo setLocations della superclass e controlla se è chiamato più di una volta all’avvio dell’applicazione. Se è presente più di un org.springframework.beans.factory.config.PropertyPlaceholderConfigurer , potrebbe essere necessario esaminare la configurazione della proprietà ignoreUnresolvablePlaceholders in modo che l’applicazione ignoreUnresolvablePlaceholders in modo pulito.

Il percorso del file delle proprietà è classpath:idm.properties

Questo è piuttosto insolito, vuol dire che idm.properties deve trovarsi al livello più alto di WEB-INF/classs o al livello più alto di uno dei vasi all’interno di WEB-INF/lib . Di solito è buona norma utilizzare una cartella dedicata per le proprietà o tenerle vicino ai file di contesto che le utilizzano.

Quindi il mio suggerimento è questo: il tuo file di proprietà è forse vicino al tuo file di contesto? Se è così, non è sul classpath (vedi questa domanda: WEB-INF è nel CLASSPATH? ).

Il classpath: prefisso viene mappato a ClassPathResource , ma probabilmente è necessario un ServletContextResource e questo verrà ottenuto da WebApplicationContext utilizzando la syntax senza prefisso:

  

Riferimento:

  • Il ResourceLoader
    (descrive in che modo i diversi tipi di ApplicationContext gestiscono le risorse senza prefisso)
  • Il meccanismo PropertyPlaceholderConfigurer
    (descrive il meccanismo )

Non è sicuramente un problema con il file delle proprietà che non viene trovato, poiché in quel caso viene lanciata un’altra eccezione.

Assicurati di avere effettivamente un valore con chiave idm.url in idm.properties .

Continuo a credere che abbia a che fare con il file di puntelli che non si trova entro la spring. Fai un rapido test passando i parametri come parametri jvm. cioè -Didm.url = ….

assicurati che il tuo file di proprietà esista nella directory classpath ma non nella sottocartella della directory classpath. se è presente nella sottocartella, scrivi come segue classpath: subfolder / idm.properties

Assicurarsi che ‘idm.url’ sia impostato nel file delle proprietà e che il file delle proprietà sia caricato