Java spring jndi命名异常:名称[spring.liveBeansView.mbeanDomain]未在此上下文中绑定

Java spring jndi命名异常:名称[spring.liveBeansView.mbeanDomain]未在此上下文中绑定,java,spring,jndi,Java,Spring,Jndi,我的带有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

我的带有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]
我不知道这些信息是什么意思。我使用
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>

/WEB-INF/config/jdbc.properties
我找不到在中使用了
JNDI
。我已经搜索了一些有关此异常的问题。但它们总是与
@Profile
@Configuration
关联。我的代码中没有
@Profile
@Configuration

在我的bean类中,没有
@bean
注释。这些信息与此相关吗?但是我不需要spring注入我的bean类。

这是关于为什么它在spring 3.2中第一次被引入的原因的简单解释。此外,您还可以在中找到此功能的更多详细信息

基本上,这个特性是一种通过JMX公开存在于某个应用程序上下文中的bean的实时列表的方法。例如,您在Tomcat中部署了一个webapp,在启动它时,您将其作为一个名为
spring.liveBeansView.mbeanDomain的环境变量传递给它。假设你没有给它任何值,或者只是一个空字符串。Spring在一长串可能的位置中搜索此类属性,并在系统环境中找到它。如果找到它,它将知道如何通过JMX公开该live Bean列表(JSON格式)

如果将JConsole连接到Tomcat实例,您将看到一个名为
DefaultDomain
的条目,并在该条目下显示应用程序的名称。如果您扩展该属性,那么应该有一个名为
SnapshotAsJson
的属性,这是来自您的webapp应用程序上下文的bean的实时列表

如果您给系统环境变量指定了一个值,比如说“test_domain”,那么在JMX中,条目将被称为
test_domain
,而不是
DefaultDomain

因此,基本上您看到这些调试消息是因为Spring在一长串位置中搜索
Spring.liveBeansView.mbeanDomain
属性,JNDI(对于JEE服务器)就是其中之一


在SpringSource工具套件的最新版本中(可能在一些早期版本中),有一个特性利用了这个LiveBeans JMX公开,称为“LiveBeans图”这将采用JSON表示,并创建这些bean的基本图形表示。

如果您不使用任何配置文件或MBean,只需将以下上下文参数添加到web.xml作为解决方法(技巧),希望有人能提供比这个丑陋的更好的解决方案


spring.profiles.active
发展
spring.profiles.default
发展
spring.liveBeansView.mbeanDomain
发展

如何使用批注实现这一点?很好。将其添加到web.xml中后,控制台将显示调试:org.springframework.core.env.PropertySourcesPropertyResolver-在[servletConfigInitParams][artifact:mvn]中搜索键'spring.liveBeansView.mbeanDomain'DEBUG:org.springframework.core.env.PropertySourcesPropertyResolver-在[servletContextInitParams][artifact:mvn]中搜索键'spring.liveBeansView.mbeanDomain',DEBUG:org.springframework.core.env.PropertySourcesPropertyResolver-在[servletContextInitParams]中找到类型为[String]的键'spring.liveBeansView.mbeanDomain'并重视“dev”
也谢谢您。这个答案是唯一一个可以很好的答案。我想我应该在谷歌上搜索一些关于liveBeansView的知识。如果您使用此解决方法,请注意,
参数值对于您在容器中部署的每个web应用程序都必须是唯一的,否则您将得到一个
javax.management.InstanceAlreadyExistsException
,web应用程序将无法部署。