Ma webapp avec le printemps 3.2.4 fonctionne bien. Mais au démarrage, j'obtiendrai des informations de débogage:
2014-05-20 11:11:47 DEBUG JndiTemplate:150 - Looking up JNDI object with name [Java:comp/env/spring.liveBeansView.mbeanDomain]
2014-05-20 11:11:47 DEBUG JndiLocatorDelegate:101 - Converted JNDI name [Java:comp/env/spring.liveBeansView.mbeanDomain] not found - trying original name [spring.liveBeansView.mbeanDomain]. javax.naming.NameNotFoundException: Name [spring.liveBeansView.mbeanDomain] is not bound in this Context. Unable to find [spring.liveBeansView.mbeanDomain].
2014-05-20 11:11:47 DEBUG JndiTemplate:150 - Looking up JNDI object with name [spring.liveBeansView.mbeanDomain]
2014-05-20 11:11:47 DEBUG JndiPropertySource:87 - JNDI lookup for name [spring.liveBeansView.mbeanDomain] threw NamingException with message: Name [spring.liveBeansView.mbeanDomain] is not bound in this Context. Unable to find [spring.liveBeansView.mbeanDomain].. Returning null.
2014-05-20 11:11:47 DEBUG PropertySourcesPropertyResolver:81 - Searching for key 'spring.liveBeansView.mbeanDomain' in [systemProperties]
2014-05-20 11:11:47 DEBUG PropertySourcesPropertyResolver:81 - Searching for key 'spring.liveBeansView.mbeanDomain' in [systemEnvironment]
2014-05-20 11:11:47 DEBUG PropertySourcesPropertyResolver:103 - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source. Returning [null]
2014-05-20 11:11:47 DEBUG DispatcherServlet:533 - Published WebApplicationContext of servlet 'spring' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.spring]
Je ne sais pas ce que signifient les infos. J'utilise c3p0
comme mon dataSource
, et la configuration est:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/config/jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="autoCommitOnClose" value="true"/>
<property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/>
<property name="initialPoolSize" value="${cpool.minPoolSize}"/>
<property name="minPoolSize" value="${cpool.minPoolSize}"/>
<property name="maxPoolSize" value="${cpool.maxPoolSize}"/>
<property name="maxIdleTime" value="${cpool.maxIdleTime}"/>
<property name="acquireIncrement" value="${cpool.acquireIncrement}"/>
<property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="jdbcTemplate" />
</bean>
Je ne trouve pas où JNDI
est utilisé. J'ai cherché quelques questions sur cette exception. Mais ils sont toujours associés à @Profile
ou @Configuration
. Il n'y a pas @Profile
ou @Configuration
dans mon code.
Dans ma classe de haricots, il n'y a pas de @Bean
annotation. Les infos sont-elles liées à cela? Mais je n'ai pas besoin du printemps pour injecter ma classe de haricots.
si vous n'utilisez pas profils ou mbeans, ajoutez simplement context-params à web.xml comme solution de contournement (astuce), j'espère que quelqu'un peut fournir une meilleure solution que celle-ci.
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.liveBeansView.mbeanDomain</param-name>
<param-value>dev</param-value>
</context-param>
Ceci est le problème JIRA et une courte explication sur la raison pour laquelle il a été introduit pour la première fois au printemps 3.2. De plus, vous trouverez un peu plus de détails dans le commit initial pour cette fonctionnalité.
Fondamentalement, cette fonctionnalité est un moyen d'exposer via JMX une liste en direct de beans qui existent dans un contexte d'application à partir d'une certaine application. Par exemple, vous avez déployé une application Web dans Tomcat et au démarrage, vous la lui passez en tant que variable d'environnement appelée spring.liveBeansView.mbeanDomain
. Et disons que vous ne lui donnez aucune valeur, ou simplement une chaîne vide. Spring recherche une longue liste d'emplacements possibles pour ce type de propriété et la trouve dans l'environnement système. S'il est trouvé, il saura exposer cette liste de beans vivants (au format JSON) via JMX.
Si vous vous connectez avec JConsole à votre instance Tomcat, vous verrez une entrée appelée DefaultDomain
et sous elle le nom de votre application. Si vous développez qu'il devrait y avoir un attribut appelé SnapshotAsJson
et qu'il s'agit de la liste en direct des beans du contexte d'application de votre application Web.
Si vous aviez donné une valeur à votre variable d'environnement système, disons "test_domain", dans JMX l'entrée aurait été appelée test_domain
et non DefaultDomain
.
Donc, en gros, vous voyez ces messages DEBUG parce que Spring recherche spring.liveBeansView.mbeanDomain
propriété dans une longue liste d'emplacements, JNDI (dans le cas des serveurs JEE) étant l'un d'entre eux.
Dans la dernière version de SpringSource Tool Suite (et peut-être dans certaines versions antérieures), il existe une fonctionnalité qui utilise cette exposition JMX de beans vivants appelée "Live Beans Graph" qui prend cette représentation JSON et crée une représentation graphique quelque peu basique de ces des haricots.