我们有一些集成测试,但最近当@ManagedResource是在路上,我们都面临着一个问题:
Unable to register MBean [com.api.configuration.ApiConfiguration@63fde7ca] with key 'apiConfiguration'; nested exception is javax.management.InstanceAlreadyExistsException: api:name=ApiConfiguration
而违规豆看起来是这样的:
@Component
@ManagedResource(objectName = "api:name=ApiConfiguration")
public class ApiConfiguration {
@ManagedOperation
public void reloadConfiguration() {
// do something
}
}
我们试图在没有成功的每个集成测试添加@DirtiesContext
。只有从运行Maven的或全部的IntelliJ测试时出现的错误。如果我们只运行它的工作测试失败之一。
如果您使用的是基于Java的配置,您只需要添加此
@EnableMBeanExport(注册= RegistrationPolicy.REPLACE_EXISTING)OR @EnableMBeanExport(注册= RegistrationPolicy.IGNORE_EXISTING)
因此,将(根据您的配置)更换或使用已有的bean,它不会给任何类型的错误
该错误是很清楚的,已经有一个实例,有人正试图创建一个。它失败。
要解决这个问题的一种方法,在问题只出在测试中,是忽略重复MBean的注册:
<context:mbean-export registration="ignoreExisting"/>
或者,如果你喜欢的注释方式:
@Autowired
MBeanExporter mBeanExporter;
然后设置策略来忽略:
mBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);
默认情况下,策略设置为FAIL_ON_EXISTING。您还可以将其设置为REPLACE_EXISTING。
如果你有你的测试上面的@EnableAutoConfiguration注解,认为将其删除。这帮助了我。