@MapperScan扫描包里混有@Service等问题怎么办
导读:本文共3037字符,通常情况下阅读需要10分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: @MapperScan扫描包混有@Service问题描述@MapperScan注解配置的一般是dao或者mapper的扫描包,一般用于数据库操作,里面类的一般都是接口,如果在dao层有其他接口,比如说@Service等就会报错解决办法一把service包移走,方法可行解决办法二不使用@MapperScan,在每个dao或者mapper里面加上注解@Mapper,... ...
目录
(为您整理了一些要点),点击可以直达。@MapperScan扫描包混有@Service
问题描述
@MapperScan注解配置的一般是dao或者mapper的扫描包,一般用于数据库操作,里面类的一般都是接口,如果在dao层有其他接口,比如说@Service等就会报错
解决办法一
把service包移走,方法可行
解决办法二
不使用@MapperScan,在每个dao或者mapper里面加上注解@Mapper,方法可行
解决办法三
使用自定义注解,在mybatis的注解比较完善的情况下,就不用自己搞多少
创建注解@MyMapperScan
里面的属性全部抄袭@MapperScan
MapperScannerRegistrar换成自己的
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(MyMapperScannerRegistrar.class)@Repeatable(MapperScans.class)public@interfaceMapperScan{String[]value()default{};String[]basePackages()default{};Class<?>[]basePackageClasses()default{};Class<?extendsBeanNameGenerator>nameGenerator()defaultBeanNameGenerator.class;Class<?extendsAnnotation>annotationClass()defaultAnnotation.class;Class<?>markerInterface()defaultClass.class;StringsqlSessionTemplateRef()default"";StringsqlSessionFactoryRef()default"";Class<?extendsMapperFactoryBean>factoryBean()defaultMapperFactoryBean.class;StringlazyInitialization()default"";}
MyMapperScannerRegistrar扫描注册器
这个类和mybatis的一模一样,唯一的不同就是MyClassPathMapperScanner是自己的扫描
publicclassMyMapperScannerRegistrarextendsMapperScannerRegistrar{privateResourceLoaderresourceLoader;/***{@inheritDoc}*/@OverridepublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){AnnotationAttributesannoAttrs=AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));//这个是自己的ClassPathMapperScannerscanner=newMyClassPathMapperScanner(registry);//thischeckisneededinSpring3.1if(resourceLoader!=null){scanner.setResourceLoader(resourceLoader);}Class<?extendsAnnotation>annotationClass=annoAttrs.getClass("annotationClass");if(!Annotation.class.equals(annotationClass)){scanner.setAnnotationClass(annotationClass);}Class<?>markerInterface=annoAttrs.getClass("markerInterface");if(!Class.class.equals(markerInterface)){scanner.setMarkerInterface(markerInterface);}Class<?extendsBeanNameGenerator>generatorClass=annoAttrs.getClass("nameGenerator");if(!BeanNameGenerator.class.equals(generatorClass)){scanner.setBeanNameGenerator(BeanUtils.instantiateClass(generatorClass));}Class<?extendsMapperFactoryBean>mapperFactoryBeanClass=annoAttrs.getClass("factoryBean");if(!MapperFactoryBean.class.equals(mapperFactoryBeanClass)){scanner.setMapperFactoryBean(BeanUtils.instantiateClass(mapperFactoryBeanClass));}scanner.setSqlSessionTemplateBeanName(annoAttrs.getString("sqlSessionTemplateRef"));scanner.setSqlSessionFactoryBeanName(annoAttrs.getString("sqlSessionFactoryRef"));List<String>basePackages=newArrayList<String>();for(Stringpkg:annoAttrs.getStringArray("value")){if(StringUtils.hasText(pkg)){basePackages.add(pkg);}}for(Stringpkg:annoAttrs.getStringArray("basePackages")){if(StringUtils.hasText(pkg)){basePackages.add(pkg);}}for(Class<?>clazz:annoAttrs.getClassArray("basePackageClasses")){basePackages.add(ClassUtils.getPackageName(clazz));}scanner.registerFilters();scanner.doScan(StringUtils.toStringArray(basePackages));}/***{@inheritDoc}*/@OverridepublicvoidsetResourceLoader(ResourceLoaderresourceLoader){this.resourceLoader=resourceLoader;}}
MyClassPathMapperScanner
自己的扫描类基本也是mybatis的,就是在判断上面改动了一点点
publicclassMyClassPathMapperScannerextendsClassPathMapperScanner{publicMyClassPathMapperScanner(BeanDefinitionRegistryregistry){super(registry);}@OverrideprotectedbooleanisCandidateComponent(AnnotatedBeanDefinitionbeanDefinition){booleanflag=super.isCandidateComponent(beanDefinition);//包名带有Mapper的才会被mybatis代理booleanmapper=beanDefinition.getBeanClassName().contains("Mapper");returnflag&&mapper;}}
现在只需要用自己的扫描注解即可,用法和mybatis的一模一样
解决办法四
这个是针对第三点的,作者使用第三点的时候mybatis版本为3.4.6
mybatis-spring版本为1.3.2,spring版本为5.x
当mybatis版本为3.5.2的mybatis-spring版本为2.0.2的时候
MapperScannerRegistrar类扫描的方式发生了一点点变化,
还需要改写MapperScannerConfigurer类,其他的不变
完毕!
解决办法五
@MapperScan注解使用markerInterface或者annotationClass参数限制扫描的接口
@MapperScan包扫描的坑
在使用通用mapper执行查询时
由于不太注意顺手就导了spring的包:
importorg.mybatis.spring.annotation.MapperScan;
结果就异常:
tk.mybatis.mapper.provider.base.BaseSelectProvider:xxxx
找了半天才发现是包的问题
应该导mybatis的MapperScan而不是spring中的包,正确的包名:
importtk.mybatis.spring.annotation.MapperScan;
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
@MapperScan扫描包里混有@Service等问题怎么办的详细内容,希望对您有所帮助,信息来源于网络。