背景
我又来水一篇博客啦!
最近公司项目中需要集成积木报表工具,但是同事在集成积木报表工具的时候死活不成功
会出现积木报表的静态文件访问不到的情况,例如下图中的情况
让我看看啥情况,我也就来学习一下积木报表吧,顺便看看这啥原因,看起来好像是静态资源文件路径映射的问题
集成积木框架
导入依赖
<!--积木报表JimuReport--> <dependency> <groupId>org.jeecgframework.jimureport</groupId> <artifactId>jimureport-spring-boot-starter</artifactId> <version>1.5.8</version> </dependency>
创建数据库表
积木报表中是mysql的sql文件,如果你是其他数据库,可以先创建成mysql表,
再使用navicat将mysql数据库表转成oracle的数据库表或是其他数据库表
下载积木报表sql文件如何将mysql数据库表转成oracle等其他数据库表呢?
点击navicat上方的,工具–>数据传输,选择要导入的数据库和目标数据库,下一步选择要导入的数据库表
在下面的选项中可以选择转换对象名改成大写,这样导入后数据库表名就是大写了,详细内容可以自行百度看看修改自己系统的权限拦截路径
放开系统对积木报表请求路径的权限控制,如果你使用的权限框架是shiro
可以在项目中全局搜索下filterChainDefinitionMap.put
,应该能找到相应的shiro权限路径配置
然后增加下面的配置//积木报表排除 filterChainDefinitionMap.put("/jmreport/**", "anon"); filterChainDefinitionMap.put("/**/*.js.map", "anon"); filterChainDefinitionMap.put("/**/*.css.map", "anon");
创建自定义积木报表鉴权,这一步不是必须的
// ///** // * 自定义积木报表鉴权(如果不进行自定义,则所有请求不做权限控制) // * * 1.自定义获取登录token // * * 2.自定义获取登录用户 // */ @Component public class JimuReportTokenService implements JmReportTokenServiceI { @Autowired private ISysBaseAPI sysBaseAPI; @Autowired @Lazy private RedisUtil redisUtil; @Override public String getToken(HttpServletRequest request) { return TokenUtils.getTokenByRequest(request); } @Override public String getUsername(String token) { return JwtUtil.getUsername(token); } @Override public Boolean verifyToken(String token) { return TokenUtils.verifyToken(token, sysBaseAPI, redisUtil); } @Override public Map<String, Object> getUserInfo(String token) { String username = JwtUtil.getUsername(token); //此处通过token只能拿到一个信息 用户账号 后面的就是根据账号获取其他信息 查询数据或是走redis 用户根据自身业务可自定义 SysUserCacheInfo userInfo = sysBaseAPI.getCacheUser(username); Map<String, Object> map = new HashMap<String, Object>(); //设置账号名 map.put(SYS_USER_CODE, userInfo.getSysUserCode()); //设置部门编码 map.put(SYS_ORG_CODE, userInfo.getSysOrgCode()); // 将所有信息存放至map 解析sql/api会根据map的键值解析 return map; } }
最后部署后端系统,然后访问
http://localhost:端口号/项目根路径/jmreport/list
看看页面是否正常显示,一些样式文件的请求后端是否正常返回了,
如果出现问题,则可以看看积木报表的官方文档:积木报表官方文档
积木报表静态资源访问不到的问题
官方文档中的静态资源访问不了和我这种情况有些区别,官方文档是请求路径的问题,我这里是代码写的有问题
之前写过一个拦截器,然后需要将该拦截器配置到spring容器中,我是这么写的
@Configuration
public class MyAppConfigurer extends WebMvcConfigurationSupport {
@Autowired
private UserInfoInterceptor userInfoInterceptor;
/**
* 拦截器,将用户信息放入threadLocal
* @param registry
*/
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this.userInfoInterceptor).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
但是这么做其实有很大的问题,springmvc在系统启动时会根据自动装配类去初始化一些对象放入容器中
来看看WebMvcAutoConfiguration类中怎么写的
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class,
TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
略
}
我们可以看到@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
意思是当系统中没有该类的时候WebMvcAutoConfiguration才会生效,而我创建了它的子类,就会导致
WebMvcAutoConfiguration并不生效,所以导致系统的静态资源处理等其他默认配置失效,你需要修改为下面的形式
@Configuration
public class MyAppConfigurer implements WebMvcConfigurer {
@Autowired
private UserInfoInterceptor userInfoInterceptor;
/*
* 拦截器,将用户信息放入threadLocal
* @param
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this.userInfoInterceptor).addPathPatterns("/**");
}
}
记住,如果你和我一样是个菜逼,一定要使用WebMvcConfigurer,而不是使用WebMvcConfigurationSupport
所以还是我到处给系统埋坑,,,,TAT
相关文章