场景
svc1.jar
中有一个TestController
类,当前源代码工程 demo 依赖了这个svc1.jar
。- 当前 demo 工程启动正常,TestController 被初始化,
TestController
中提供的接口/svc1/test1
、/svc1/test2
、/svc1/test3
均可以正常访问。 - 因接口
/svc1/test2
对应的方法中逻辑处理不满足需求,需要对这个方法进行重写处理。 - 该接口在
svc1.jar
包,不能直接修改源代码。
处理方式
主要思路是在 Spring 注册 Bean 之后进行 PostProcessor 时,将已经注册的 svc1.jar
中的 TestController 从上下文中删除。使我们新创建的继承 TestController 的重写类能被正常加载实例化,而不出现 PathMapping 重复的报错冲突。
主要代码如下:
/*** 排除容器中的Bean* * @author 单红宇* @since 2024/11/28 13:14*/
@Slf4j
@Configuration
public class ExcludeComponentConfiguration implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {registry.removeBeanDefinition(getDefaultBeanName(FileController.class));registry.removeBeanDefinition(getDefaultBeanName(UserController.class));}/*** 根据类 class 获取 spring 默认的 beanName** @param clazz clazz* @return String*/private String getDefaultBeanName(Class<?> clazz) {// 测试内部类 AutowireUtils.ObjectFactoryDelegatingInvocationHandler 的默认 BeanName// StringUtils.uncapitalizeAsProperty(ClassUtils.getShortName(AutowireUtils.ObjectFactoryDelegatingInvocationHandler.class.getName()))// spring 6.0 之前使用 StringUtils.uncapitalize()return org.springframework.util.StringUtils.uncapitalizeAsProperty(ClassUtils.getShortName(clazz.getName()));}
}
/*** 重写FileController类* * @author 单红宇* @since 2024/11/28 12:03*/
@RestController //该注解必须要有,Mapping那些注解不需要
public class OverrideFileController extends FileController {@Overridepublic void fileDownload(@RequestParam("fileId") Long fileId,@RequestParam("isInline") Integer isInline,HttpServletResponse response, HttpServletRequest request) {System.out.println("override filedownload...");}}
(END)