我有一个场景,其中有一个web应用程序。在我的web应用程序中,我从另外两个jar文件中导入了"applicationContext.xml"。在两个导入的上下文文件中几乎没有常见的bean。在我的一个web应用程序类中,我遇到了一种情况,即我正在使用两个jar中的函数。
Function 1 from jar 1 : getEmployeeDetails() - needs "employeeBean" - "com.practice.Employee"
Function 2 from jar 2 : getEmployeeSalaryBreakup() - needs "employeeBean" - "com.practice.compensation.Employee"
现在的问题是,第二个函数调用正在中断,因为它无法映射bean。它给出了类CastException。我并没有在我的web应用程序中自动连接bean,它们是在jar文件中调用的。
我尝试的解决方案之一是销毁现有的bean并重新初始化。相同的PSB代码:
/*
getEmployeeDetails() //call here, uses employeeBean - com.practice.Employee
*/
ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)applicationContext;
SingletonBeanRegistry registry = configContext.getBeanFactory();
registry.destroyBean("employeeBean"); //trying to destroy existing bean
registry.registerSingleton("employeeBean", "com.practice.compensation.Employee"); //reinitialize bean with new definition
/*
getEmployeeSalaryBreakup() //call here, expecting it will use new bean definition
*/
上述实施方式对我不起作用,"registry.dedestroyBean("employeeBean"(;"-即使在执行了这一行之后,旧的bean定义仍然存在。
有人能建议我缺少什么吗,或者其他解决方案来实现这一点。由于jar文件及其上下文文件不在我的控制范围内。所以我需要在网络应用程序级别处理这个问题。
最后它是这样工作的:
/*
call function getEmployeeDetails() //uses "employeeBean" - "com.practice.Employee"
*/
BeanDefinitionRegistry beanRegistry = (BeanDefinitionRegistry) applicationContext.getAutowireCapableBeanFactory();
BeanDefinition newBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(com.practice.compensation.Employee.class).getBeanDefinition();
BeanDefinition oldBeanDefinition = beanRegistry.getBeanDefinition("employeeBean");//this is needed if u want to revert your bean changes back to how it was
beanRegistry.registerBeanDefinition("employeeBean", newBeanDefinition);
/*
call function getEmployeeSalaryBreakup() //this will now execute as it gets required bean "employeeBean" - "com.practice.compensation.Employee"
*/
//reverting back bean changes
beanRegistry.registerBeanDefinition("employeeBean", oldBeanDefinition);
您可以在销毁/注册您的bean后,尝试在applicationContext上调用refresh((:
configContext.refresh()