2014-05-20 24 views
8

La mia webapp con spring 3.2.4 funziona correttamente. Ma quando inizio su esso, mi metterò informazioni di debug:spring jndi NamingException: Nome [spring.liveBeansView.mbeanDomain] non è vincolato in questo contesto

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] 

Non so che cosa significano le informazioni. Io uso c3p0 come mio dataSource, e la configurazione è:

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

ho cant't trovare dove JNDI viene utilizzato in Ho ricerca alcune domande su questa eccezione.. Ma sono sempre associati a @Profile o @Configuration. Non c'è @Profile o @Configuration nel mio codice.

Nella mia classe bean, non è presente l'annotazione @Bean. Le informazioni sono correlate a questo? Ma non ho bisogno di iniettare la mia classe di fagioli.

risposta

11

se non si utilizza qualsiasi profili o mbeans, basta aggiungere in seguito contesto-params al web.xml come soluzione alternativa (trick), speriamo che ci sia qualcuno in grado di fornire una migliore soluzione di questo brutto.

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

Come posso farlo con l'annotazione? –

+1

Funziona bene. Dopo aver aggiunto questo in web.xml spettacoli console '[artefatto: mvn] DEBUG: org.springframework.core.env.PropertySourcesPropertyResolver - Ricerca di chiave 'spring.liveBeansView.mbeanDomain' in [servletConfigInitParams] [artefatto: mvn] debug: org.springframework.core.env.PropertySourcesPropertyResolver - Ricerca di chiave 'spring.liveBeansView.mbeanDomain' in [servletContextInitParams] [artefatto: mvn] DEBUG: org.springframework.core.env.PropertySourcesPropertyResolver - chiave 'spring.liveBeansView.mbeanDomain' in [servletContextInitParams] con Trovato digita [String] e valorizza 'dev'' – Lucky

+0

Grazie anche a te. Questa risposta è l'unica in grado di funzionare bene. Penso che dovrei google alcune conoscenze su liveBeansView. – MageXellos

7

Questo è il JIRA issue e una breve spiegazione sul motivo per cui è stato introdotto per la prima volta in primavera 3.2. Inoltre, un po 'più di dettagli puoi trovare nel initial commit per questa funzione.

Fondamentalmente, questa funzione è un modo per esporre attraverso JMX un elenco live di bean esistenti in un contesto applicativo da una determinata applicazione. Ad esempio, in Tomcat è stata distribuita una webapp e all'avvio viene passata ad essa come variabile di ambiente denominata spring.liveBeansView.mbeanDomain. E diciamo che non gli dai alcun valore, o solo una stringa vuota. Spring cerca una lunga lista di possibili posizioni per questo tipo di proprietà e la trova nell'ambiente di sistema. Se è stato trovato, saprà esporre quell'elenco di fagioli vivi (in formato JSON) tramite JMX.

Se ci si connette con JConsole all'istanza Tomcat, verrà visualizzata una voce denominata DefaultDomain e sotto il nome dell'applicazione. Se si espande, dovrebbe esserci un attributo chiamato SnapshotAsJson e questo è l'elenco live dei bean dal contesto dell'applicazione Webapp.

Se hai dato un valore alla variabile d'ambiente di sistema, diciamo "test_domain", in JMX la voce sarebbe stato chiamato test_domain e non DefaultDomain.

Quindi, in sostanza si sta vedendo quei messaggi di debug perché le ricerche della sorgente a spring.liveBeansView.mbeanDomain proprietà in una lunga lista di località, JNDI (in caso di server JEE) essere uno di loro.

Nella versione più recente di SpringSource Tool Suite (e forse in alcuni precedenti), c'è una funzione che fa uso dell'esposizione JMX di live beans denominata "Live Beans Graph" che prende quella rappresentazione JSON e crea un po 'di base rappresentazione grafica di quei fagioli.

Problemi correlati