1.在某微服务项目中,测试提出一个缺陷:在列表输入框选择条件,不点击查询而是点击翻页,点击后页面刷新,按照条件筛选出数据数量但不显示数据,其实,本质上就是分页查询的页号溢出问题。由于该项目使用的是MybatisPlus,要解决这个问题其实只要写一个MybatisPlus配置类,中设置一个属性即可。
2.但是发现这个配置类设置的这个属性值未生效,在启动类中获取bean发现这个属性依然是false,注释掉这个Bean后发现依然存在这个Bean,这时候就找到在该项目的jar包中已经存在这个Bean导致自己写的Bean未生效。
3.于是思路就是要重写这个Bean,可以实现Spring中的接口:Bean定义注册后置处理器BeanDefinitionRegistryPostProcessor。代码如下:
MybatisPlusMyConfig
package jnpf.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MyBatisPlus配置
*/
@Configuration
public class MybatisPlusMyConfig
{
/**
* @Author LiXiangrong
* @Description 复写MybatisPlusInterceptor
* @Date 2024/01/11 18:04:33
* @Return com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor
**/
@Bean("mybatisPlusInterceptor1")
public MybatisPlusInterceptor mybatisPlusInterceptor()
{
// 核心插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件(如果配置多个插件,切记分页最后添加)
PaginationInnerInterceptor innerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); // dbType(数据库类型)
innerInterceptor.setOverflow(true); // 默认值:false。溢出总页数后是否进行处理。
interceptor.addInnerInterceptor(innerInterceptor);
return interceptor;
}
}
MyBeanDefinitionRegistryPostProcessor
package jnpf.config;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.stereotype.Component;
/**
* @Author LiXiangrong
* @Description 自定义的Bean定义注册后置处理器
* @Date 2024/01/11 18:06:08
**/
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor
{
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException
{
String bean1 = "mybatisPlusInterceptor";
String bean2 = "mybatisPlusInterceptor1";
// 复写MybatisPlusInterceptor
// 若jar包和程序都注册了mybatisPlusInterceptor,就将程序里的bd覆盖掉jar包里的bd(继续使用jar包里的beanName,防止jar包中其它bean指定依赖了这个beanName)
if (registry.containsBeanDefinition(bean1) && registry.containsBeanDefinition(bean2))
{
// 移除bean1,用bean2注册一个新的bean1,然后把bean2移除(复写了bean1)
registry.removeBeanDefinition(bean1);
registry.registerBeanDefinition(bean1, registry.getBeanDefinition(bean2));
registry.removeBeanDefinition(bean2);
}
}
@Override
public void postProcessBeanFactory(@NotNull ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException
{
}
}
评论 (0)