# 常见问题

# 如何配置JSON日期的格式

使用Jackson的配置如下(Spring Boot默认使用Jackson):

spring:
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
1
2
3
4

其它的自行参考json框架配置

# 出现找不到db模块的错误

目前已知两种情况:

  • 未配置数据源
  • 未引用spring-boot-starter-jdbc

# 如何获取RequestBody中的参数

脚本中使用body.xxx获取RequestBody中的参数 SQL中使用#{body.xxx}${body.xxx}获取RequestBody中的参数

# 如何获取Header中的参数

脚本中使用header.xxx获取Header中的参数 SQL中使用#{header.xxx}${header.xxx}获取Header中的参数

# 如何获取Cookie中的参数

脚本使用cookie.xxx获取Cookie中的参数 SQL中使用#{cookie.xxx}${cookie.xxx}获取Cookie中的参数

# 如何获取Session中的参数

脚本中使用session.xxx获取Session中的参数 SQL中使用#{session.xxx}{session.xxx}获取Session中的参数

# 如何获取PathVariable中的参数

脚本中使用PathVariableNamepath.xxxx获取PathVariable中的参数 SQL中使用#{PathVariableName}#{path.xxx}获取PathVariable中的参数

# 如何获取上传的文件

利用Request模块

import request;
request.getFile('name');
1
2

# 如何获取提交的数组参数

利用Request模块

import request;
return request.getValues('name');
1
2

# 如何打印SQL语句

JdbcTemplate的打印SQL语句方式一样

logging:
  level:
    org:
      springframework:
        jdbc:
          core:
            JdbcTemplate: DEBUG #打印SQL
            StatementCreatorUtils: TRACE  #打印SQL参数
1
2
3
4
5
6
7
8

# 如何给接口添加权限

一般情况采用拦截器实现 在接口选项中配置permissonrole或自定义选项 随后在拦截器实现:

@Component
@Order(1)   //拦截器顺序
public class PermissionInterceptor implements RequestInterceptor {

    @Override
    public Object preHandle(ApiInfo info, MagicScriptContext context, HttpServletRequest request, HttpServletResponse response) {
        // 获取配置的接口选项属性
        String permissionCode = info.getOptionValue(Options.PERMISSION);
        // 执行自己的代码逻辑进行判断是否有权限
        // ....
        if(无权限){
        	// 需要注意的是,拦截器返回的不会走ResultProvider。
            return new JsonBean<>(403,"无权访问");
        }
        // 放行
        return null;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 如何给UI添加权限

请参考自定义UI鉴权

# ${}和#{}的区别

主要区别在于${}用于拼接SQL(会产生SQL注入问题),#{}会替换成占位符(不会产生SQL注入问题),这里的区别于Mybatis一致

# 如何循环拼接参数

两种办法:

  • in (#{ids})的语法会自动对集合参数展开
var ids = [1,2,3,4,5,6];
//会自动变成select * from sys_user where id in(?,?,?,?,?,?)
return db.select('select * from sys_user where id in(#{ids})'); 
1
2
3
  • 循环拼接SQL
var list = [1,2,3,4,5];
var sql = "select * from sys_user where ";
for(index,item in list){
    sql = sql + 'id = #{list['+index+']}';
    if(index + 1 < list.size()){
        sql = sql + ' or ';
    }   
}
return db.select(sql);
1
2
3
4
5
6
7
8
9

# 多数据源如何配置

编写java代码如下:

@Bean
public MagicDynamicDataSource magicDynamicDataSource(){
    MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
    // 设置默认数据源(默认数据源一定要设置)
    dynamicDataSource.setDefault(ds1);
    dynamicDataSource.add("slave",ds2);
    return dynamicDataSource;
}
1
2
3
4
5
6
7
8

脚本中使用:

db.select('select * from sys_user');  //使用默认数据源
db.slave.select('select * from sys_user');  //使用slave数据源
1
2

# SQL执行报错java.sql.SQLFeatureNotSupportedException: null

原因:druid版本过低,升级至最新版后即可

# 如何自定义返回结果

  • 通过配置文件进行配置,具体参考spring-boot配置
  • 通过自定义JSON结果,具体定义方法查看自定义JSON结果
  • 通过自定义拦截器拦截返回自己想要的格式,具体定义方法查看自定义拦截器
  • 通过spring的拦截器返回想要的格式,如ResponseBodyAdviceHandlerMethodReturnValueHandler(这种方式目前会影响到UI,故不推荐使用)

# 页面加载缓慢

由于monaco-editor编辑器比较大,建议开启压缩静态资源

server.compression.enabled=true #启用压缩
server.compression.min-response-size=256 #大于256kb时压缩
1
2

# 脚本内容被转义

出现这种情况,请检查自身项目是否有XSS一类的过滤器,需要把UI界面对应的后台接口排除掉即可

# 执行测试无响应

目前已知有两种情况

  • 使用了Spring Boot 2.3.5版本,升级至2.3.6解决
  • 使用了nginx代理,加一条配置proxy_buffering off;解决

# 访问UI404

  • 请检查访问路径是否正确
  • 请检查magic-editor包是否被引入
  • 如果是拉源码运行,则需要编译一下前端。
  • 如果以上确定没问题,请检查应用中是否有关于mvc的配置,如果有请检查是否是extends WebMvcConfigurationSupport的形式,是的话,改成implements WebMvcConfigurer的形式。
  • 如以上问题均不存在,请提ISSUE (opens new window) 或加群739235910 (opens new window)反馈
上次更新: 8/29/2021, 8:57:58 AM
赞助商