web-dev-qa-db-ja.com

spring jndi NamingException:名前[spring.liveBeansView.mbeanDomain]はこのコンテキストにバインドされていません

Spring 3.2.4がインストールされた私のwebappは正常に動作しています。しかし、起動すると、デバッグ情報が表示されます。

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]

情報の意味がわかりません。私はdataSourceとしてc3p0を使用し、構成は次のとおりです。

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

JNDIが使用されている場所が見つかりません。この例外に関する質問を検索しました。ただし、これらは常に@Profileまたは@Configurationに関連付けられます。コードに@Profileまたは@Configurationがありません。

私のBeanクラスには、@Beanアノテーションはありません。これに関連する情報はありますか?しかし、私は春に私の豆のクラスを注入する必要はありません。

10
lbear

profilesまたはmbeansを使用しない場合は、次のcontext-paramsweb.xmlに追加するだけです回避策(トリック)として、うまくいけば、この醜いソリューションよりも優れたソリューションを提供できる人がいるかもしれません。

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

これは JIRAの問題 であり、なぜこれがSpring 3.2で初めて導入されたのかについての簡単な説明です。また、この機能の initial commit で詳細を確認できます。

基本的に、この機能は、JMXを介して、特定のアプリケーションのアプリケーションコンテキストに存在するBeanのライブリストを公開する方法です。たとえば、Tomcatにwebappがデプロイされていて、起動時にspring.liveBeansView.mbeanDomainという環境変数として渡されます。また、値を指定しないか、または空の文字列を指定するとします。 Springは、この種のプロパティについて可能な場所の長いリストを検索し、システム環境でそれを見つけています。見つかった場合は、JMXを介してライブBeanのリスト(JSON形式)を公開することがわかります。

JConsoleを使用してTomcatインスタンスに接続すると、DefaultDomainというエントリが表示され、その下にアプリケーション名が表示されます。展開すると、SnapshotAsJsonという属性があり、これはWebアプリケーションのアプリケーションコンテキストからのBeanのライブリストです。

システム環境変数に値を指定した場合、「test_domain」としましょう。JMXでは、エントリはDefaultDomainではなくtest_domainと呼ばれます。

つまり、Springは場所の長いリストでspring.liveBeansView.mbeanDomainプロパティを検索し、JNDI(JEEサーバーの場合)がその1つであるため、基本的にはこれらのデバッグメッセージが表示されます。

SpringSource Tool Suiteの最新バージョン(およびおそらく以前のバージョン)には、このLive BeanのJMX公開を利用する「Live Beans Graph」と呼ばれる機能があり、JSON表現を取り、それらのやや基本的なグラフィック表現を作成します豆。

8
Andrei Stefan