spring-boot开发一堆问题
1 spring-boot + shiro 自定义过滤器 不按filterChain的规则执行
版本:spring-boot 1.5.15.RELEASE + shiro 1.4.0
当自定义filter以后,把自定义的filter配置到shiro的filterChain以后,发生了超出预期的效果,本来shiro中filterChain的的原则是从上往下匹配,当有一个规则匹配以后,就不会继续匹配filterChain剩下的规则,也就是filterChain的机制是短路的,只要找到一个filter过滤规则满足就返回。
当与springboot集成以后,自定义的filter使用@Bean的方式生成,当在filterChain最后面配置一条规则,使用的是自定义过滤器,形式:/* = customeAuthc,这时候奇怪的事情发生了,所有满足/*的请求都会被拦截。
然后就开始找原因:一开始是找是不是自定义filter使用的方式不对,确定是正确以后;接着就开始找是不是shiro的filterChain的匹配规则问题,甚至一度怀疑shiro会执行filterChain的所有满足条件的过滤器,又仔细翻了shiro关于filterChain的执行规则以后,确定只执行第一个匹配的规则以后。然后就网上开始找,最后终于找到一篇讲这个,就找个这一篇也是醉了,根据文章的描述,找到原因了,是因为自定义的filter默认springboot也会把它注册到全局filter中去,就相当于我们之前servlet开发的时候,在web.xml中定义的filter会拦截所有匹配的url。但是我们没有给filter配置拦截的规则,这时候是按照shiro的filterChain里面的定义的规则来拦截。
解决办法:不要springboot把这个filter当成拦截器去自动注册,就把它当成一个普通的bean就行了。
@Bean public FilterRegistrationBean registration(AuthorizationFilter authorizationFilter) { FilterRegistrationBean registration = new FilterRegistrationBean(authorizationFilter); // 不要让springboot接管该filter registration.setEnabled(false); return registration; }
2 spring-boot + mybatis typeAliasesPackages失效 导致mapper.xml中resultType直接写类名报错
异常信息: java.lang.ClassNotFoundException
版本:spring-boot 1.5.15.RELEASE + mybatis 3.4.6 + mybatis-spring 1.3.2
项目开发完成以后,通常需要打包,默认maven打出来的包是没有依赖jar,不可以执行。这时候使用spring-boot-maven-plugin这个插件以后,就可以把spring-boot项目打包成一个可执行的jar,这个jar相当于我们常说的fat jar,包含了所有的依赖jar。
一般在mybatis开发的时候,在mapper.xml中,写select的时候,需要用resultType或者resultMap来指定返回类型,resultType指定的时候,一般我们会省略包名,直接写类名,然后在mybatis的全局配置中设置
typeAliasesPackages对应包名。
当这两种结合以后,就出现了意想不到的结果,resultTpe中写类名,在spring-boot打出来fat jar以后,通过命令行执行,直接抛出异常java.lang.ClassNotFoundException。关键在于,当我们在ide中项目可以完美的运行,一打出fat jar以后运行就报错。
当然解决方案很简单,但是这种方式不是我们期望的方式,因为这种解决办法然我们很无语。把typeAliasesPackages去掉,resultType里面写全限定类名(带包名一起),就可以解决。
这种解决方式真是彻底的倒行逆施,本来为了方便开发,搞出一个typeAliasesPackages来,现在又要写全名了,明显是bug啊。
上一篇: 前后端分离,Excel导出实现
下一篇: DataVec/读取器