1. 常见问题
1.1. 在配置类中注入xxxbean,导致xxxbean的aop失效
在配置类中注入bean,需要增加@Lazy注解,不然注入的这个bean是原生对象,没有被spring代理,导致 事务、aop等都不生效
1.2. BussinessException异常使用规范
BussinessException只用于抛出异常,返回给用户交互的提示信息,禁止使用返回具体异常信息
1.3. 数组值通过逗号分隔保存规范
以文章属性为例,可选择多个,属性值通过","分隔保存
保存时,需要组织值按照一定的顺序进行保存
在组织文章属性精确查询参数时,也按照此顺序进行参数组织,避免因为多个值顺序不同而导致搜索失效问题
1.4. 非net.mingsoft包下的接口在swagger中显示
修改启动类配置,@SpringBootApplication(scanBasePackages = {"net.mingsoft","包名"})
修改SwaggerConfig配置类
import com.google.common.base.Predicates;
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(enable).select()
//.apis(RequestHandlerSelectors.basePackage("net.mingsoft"))
.apis(Predicates.or(RequestHandlerSelectors.basePackage("net.mingsoft"),RequestHandlerSelectors.basePackage("包名")))
.paths(PathSelectors.any())
.build();
}
- 编译重启
1.5. 多项目依赖刷新项目提示**.git not found?
因为这个仓库已经被删除,idea拉取不到,这应该属于idea的多模块依赖缓存没更新问题。实际上多模块里面根本就没有ms-mpeople-co的依赖,解决方法如下
1.6. 如何快速的找到接口所对应的action?
ex: 登录时,快速找到所对应的action
把前端开发者工具打开
得到了项目路径+/organization/checkLogin.do,我们需要拿到的就是后面的接口路径。若是使用idea开发,则只需按2下shift键,把接口路径粘贴进去,这时就看到了处理该接口的控制层方法
如果不是idea也不必着急,按照上文模块的介绍,我们先找到action包,我们看到项目接口路径/organization/checkLogin,按照开发规范,我们只需在第一级路径上拼接上找到该模块,即找到organization模块,然后第二级路径checkLogin,则是处理该具体请求的接口方法
1.7. 如何根据链接快速找到项目所在的静态页面?
ex: 点击系统日志菜单,找到系统日志对应的静态页面
如同同上方法,把开发者工具打开,找到发出的接口请求
得到接口项目路径/basic/systemLog/index.do,在idea里同样双击shift,把接口贴进去,即找到了所对应的静态页面
1.8. freemarker的localDateTime问题
日期会显示T的问题 参考博文--freemarker对Java 8 日期/时间的兼容性问题
1.9. 导入本地模块依赖
有时候,我们需要更改依赖的铭软模块代码或对其进行调试,这时就可以导入到项目里进行本地依赖
ex:导入铭软ms-base模块
已idea为例,点击左上角File里的Project Structure,或快捷键ctrl+shift+alt+s,按照下图所示把需要导入的模块ms-base导入到项目里
四、刷新Maven工程
至此,本地依赖导入完成
1.10. 启动类或包找不到问题解决方式
遇到类找不到或包找不到的问题首先尝试maven clean,再刷新.
若还是解决不了可以清空idea缓存试试
[!tip]快速清空idea缓存方法:删除.idea文件,删除.iml文件再重新打开项目
1.11. 获取当前登录用户
前端登录:
```java
BasicUtil.getSession(net.mingsoft.people.constant.e.SessionConstEnum.PEOPLE_SESSION)
1.12. Map大小写
推荐使用忽略大小写的Map对象 CaseInsensitiveMap
1.13. List 使用
使用时候必须先判断再使用,推荐使用hutool工具类CollUtil的方法判断
1.14. 前端for循环使用
使用时必须先定义变量,
...
//查询列表
list: function() {
var that = this;
var form = JSON.parse(JSON.stringify(that.form));
var key;
for (key in form) {
if (!form[key]) {
delete form[key];
}
}
}
...
1.15. 控件加载数据问题
控件渲染结束,但数据未渲染,可以通过 :key="value"来刷新控件,value是控件v-model绑定的值
<el-row :gutter=10 justify="start" align="top">
<el-cascader
:key="cityValue"
ref="cityRef"
v-model="cityValue"
:props="cityProps"
@change="cityHandleChange">
</el-cascader>
</el-row>
1.16. 列表提示信息
涉及到多种情况的提示,推荐在列表处使用问号。
1.17. 表单编辑
每一次打开表单必须初始化所有值,特别是主键ID
1.18. 返回信息国际化处理
代码参考
if(StringUtils.isBlank(category.getCategoryTitle())){
return ResultData.build().error(getResString("err.empty", this.getResString("category.title")));}
以上代码对栏目标题进行了空判断,为空则返回错误信息。
其中:
“getResString("err.empty")”会默认从base基础模块的资源文件开始,以"err.empty"作为key寻找对应国际化信息,资源文件为key=value格式,value支持占位符,下标从0开始计算。
;
“this.getResString("category.title")”则会寻找自身模块下资源文件,用对应国际化信息填充占位符,最终的返回信息则为:Column management name not empty。
1.19. 获取请求中携带的参数
在业务代码中,可以看到接口入参是没有形参接收manageId这个值的,在代码中可以通过BasicUtil的getString()方法获取请求中携带的manageId这个参数值。除此之外BasicUtil还有诸如getInt()、getBoolean()等方法,通过assemblyRequestMap()方法可以获取请求中携带的所有参数,得到一个Map集合;
[!tip]注意除了在控制层外,请不要在其他地方使用这个类去获取请求中携带的参数。