我使用Spring公开MBean并将其注册到JBoss MBean服务器。当战争被放入JBoss的一个实例时,这很好。但是在运行单元测试时它不起作用(这是有道理的,因为没有运行JBoss的实例) 以下是弹簧配置的摘录
<bean id="updateConfigMBean" class="mypackage.UpdateConfigMBean"/>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="server">
<bean class="org.jboss.mx.util.MBeanServerLocator" factory-method="locateJBoss"/>
</property>
<property name="beans">
<map>
<entry key="mypackage:name=configurationMBean" value-ref="updateConfigMBean"/>
</map>
</property>
</bean>
我正在寻找的是一种处理这个问题的优雅方式(不希望有两个弹簧配置(用于测试和部署),并且禁用弹簧配置验证测试不是一种选择。
谢谢!
答案 0 :(得分:0)
这是你可能需要有两个配置的情况之一,一个用于测试,一个用于部署。
这是Maven的优点,因为您可以清楚地分离部署配置和测试配置。如果你担心保持两个配置,那么你需要构建你的配置,以便将所有常见位导入到其他配置中(这就是我们如何做到的)。
答案 1 :(得分:0)
我正在使用@Bean来解决这个问题。 @Bean是为特定环境的bean创建而量身定做的。
下面的逻辑基本上是在开发(Tomcat)和测试(JUnit)中,使用MBeanServerFactoryBean。否则使用JBoss MBean Server。
@Bean
def mbeanServer: MBeanServer = {
val server = if (environment == "development" || environment == "test") {
val factory = new MBeanServerFactoryBean
factory.setLocateExistingServerIfPossible(true)
factory.setRegisterWithFactory(true)
factory.afterPropertiesSet()
log.info("using default MBeanServer")
factory.getObject
} else {
val clazz = Class.forName("org.jboss.mx.util.MBeanServerLocator")
val locateJboss = clazz.getMethod("locateJBoss", List.empty[Class[_]].toArray: _*)
log.info("using JBoss MBeanServer")
locateJboss.invoke(null,
List.empty[java.lang.Object].toArray: _*).asInstanceOf[MBeanServer]
}
log.info("mbeanServer: " + server)
server
}
在Spring 3.1中,您可以解决此问题,并仍然使用配置文件来使用XML配置。但上面的内容适用于Spring 3.0。