跳至主要內容

4.JFinal常见问题处理

holic-x...大约 7 分钟框架JFinalBUG

JFinal框架-JFinal常见问题处理

[TOC]

JFinal常见问题处理

【1】同一个接口请求多次调用render系列方法

​ 在一次请求中调用多次 render 系列方法,只有最后一次调用有效,只要没有return,代码会继续执行下去,仅仅根据判断直接调用render返回数据则毫无意义。

​ 使用render系列方法(renderToString 除外),不会马上渲染视图,只有当方法执行完后才会真正的渲染视图,因此render之后是代码可以正常执行。当多次调用render系列方法(renderToString 除外),只有最后调用的那个方法才会生效。如果想render之后马上渲染视图,就直接在render后直接return;结束方法。可有下述两种解决方式实现:

方式1:不直接render,而是通过条件判断设置baseResponse,最后直接render即可

image-20201002105312915

方式2:在调用完render方法后直接“return”跳出方法,则生效的是最后一次调用的render方法

image-20201002105322353

【2】JFinal常见基本异常排查处理

a.注解配置异常

(1)对象注入空指针异常

​ 对象注入空指针异常:常见xxxService\xxxDAO未初始化报空指针异常,此时需要检查注入的注解是否正确,是否在Config文件内进行配置?其次检查对象是否进行了初始化操作(普通变量在创建的时候进行初始化操作,而类似xxxService这类的对象则可借助注解或者是相关初始化规则进行初始化操作)

方式1:借助JFinal的AOP机制

private UserService userService = Aop.get(UserService.class);

方式2:new 方法创建对象

private UserService userService = new UserService();

方式3:注解式@Inject(需要进行注解配置)

image-20201002105601467

@Inject
private UserService userService;

​ me.setInjectDependency(true) 仅是针于 jfinal 的 web 组件而言的配置。而 Aop.get(...)、Aop.inject(...) 无需配置即可支持注入。配置完成以后就可以在控制器、拦截器中完成属性注入。使用 Inject 注入的前提是使用 @Inject 注解的类的对象的创建是由 jfinal 接管的,例如 Controller、Interceptor、Validator 的创建是 jfinal 接管的。否则可能在使用@Inject注解的时候可能会出现注解配置依赖注入不生效的问题

image-20201002105658560

​ 需要了解JFinal的依赖注入机制-“注入动作可以向下传递”。例如在 Controller 中使用 @Inject 注入一个 AaaService,那么在 AaaService 中可以使用 @Inject 注入一个 BbbService,如此可以一直向下传递进行注入如果需要创建的对象并不是 jfinal 接管的,那么可以使用 Aop.get(...) 方法进行依赖对象的创建以及注入

整个@Inject链条的顶端只要是 jfinal 创建的就可以使用@Inject 一直注入下去:Service中之所以可以使用 @Inject ,是因为 Controller 是 jfinal 创建的,而 Service 又是在 Controller 中被注入的。因此在使用@Inject进行依赖注入出现空指针异常的时候需要排查对应接口属性以及其向下关联的类是否延用@Inject配置,或者考虑用Aop.get()方法;

(2)Db相关异常

​ 配置文件加载,sql模板映射配置、实体映射配置(绑定)问题

​ 在使用 model.find(....) 这类方法时碰到 NullPointerException 异常,通常是由于该 model 没有使用 ActionRecordPlugin.addMapping(....) 进行过映射

image-20201002105806708

​ Db空指针,查看引用的模板对象是否正确指向,是否对dao对象初始化,Db模板是否加载?加载是否成功?

​ 如果是Db操作异常,排除注解问题之后可检查sql模板是否正常进行添加

image-20201002105823249

(3)拦截器配置异常

​ 理解拦截器机制,拦截器配置是针对Controller层或其中的方法,如果将注解配置在Service层或DAO层,则出现以下错误

image-20201002105842124

​ 相应需要检查拦截器异常错误

(4)依赖注解配置加载异常

​ 依赖注解配置开启:(需注意dao、service层如果使用了注解需考虑传递性)

image-20200818145132352

注解:(区分springboot),应该使用实体类进行注入,而非接口定义

image-20200818150401076

通过editUser.save();访问方法出错,实体类和数据表的映射关系需要进行配置

image-20200818151708636

​ dao层空指针异常报错,检查对应的模板是否存在(指定sql模板)

​ jfinal的findFirst是默认获取集合中的第一个数据,因此在使用的时候要注意这个问题引起的业务逻辑处理问题

b.文件上传、下载异常

​ 文件上传空指针异常:通过判断验证进行不同情况的处理

image-20201002105859384

​ 文件下载空指针异常:下载文件不能为null,要进行空指针验证

image-20201002105908080

c.JFinal模板应用排错(常见问题)

​ 修改:数据库设置语句(jfinal模板常见问题)

​ update set table_x field_1='', field_2='',正常修改数据(参考)

​ update set table_x field_1='' and field_2='' and ....,sql语句后台正常执行不报错,但只设置了第一个指定的值或者是没有设置值且其他值并没有变动

image-20201002105931645

d.Jfinal项目前后端整合

​ 通過“redirect(SystemConst.INDEX_URL);”只能访问webapp下的文件(非WEB-INF)

但无法直接访问WEB-INF下的文件内容,需要相应进行调整

image-20200820171351284

​ 通过render访问的数据:之所以能够访问成功是因为controller定义的路径恰好和页面定义相对路径级数相同,使得页面能够正常访问数据(通过相对路径正常访问静态资源文件)

​ 此时通过render引入的页面其相对路径是根据映射配置的接口路径为参考

image-20200820173322433

​ 则其引用的相对路径html访问也异常

image-20200820173847213

参考说明:https://www.pianshen.com/article/4349119459/

image-20200820175023635

​ controller视图与文件夹映射相互对应

​ 通过 配置路径视图映射:

routes.add("/", MainController.class,"WEB-INF/view");

​ 随后访问数据,还是出现静态资源无法加载的情况

/**
     * 默认路径
     */
    @Clear(LoginInterceptor.class)
    public void test() {
            render("index.html");
    }

JFinal路径配置:

  • 方式1:

​ 将所有资源文件文件放在resources通过相对路径访问,在controller层用redirect(SystemConst.INDEX_URL);实现页面跳转

public static final String LOGIN_URL = "/custom/view/login.html";
public static final String INDEX_URL = "/custom/view/index_v2.html";
public static final String ERR_404_URL = "/custom/view/404.html";

​ 使用JFinal路由配置可能出现资源文件路径404不匹配的问题,待解决

  • 方式2:

    将静态资源文件放置在resources文件夹下,将html文件放置在WEB-INF文件夹下

a.通过传入url指定要跳转的页面路径,由后台接口实现页面跳转
/**
  * 页面跳转
 **/
配置url:/report/page/pageJump?url=WEB-INF/view/xxx/xxx/xxx.html
@Clear(LoginInterceptor.class)
public void pageJump() {
	render(getPara("url"));
}

b.通过在相应的Controller中定义index方式实现对应功能项主页面跳转
/**
  * 跳转到用户管理页面
 **/
public void index() {
 	// 绝对路径配置
	render("/WEB-INF/view/system/user/user_list.html");
 }

​ 对应html中以绝对路径的方式引入相关的css、js等静态资源文件

<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>用户列表</title>
    <!-- Bootstrap Styles-->
    <link href="/report/resources/assets/css/bootstrap.css" rel="stylesheet"/>
    <!-- FontAwesome Styles-->
    <link href="/report/resources/assets/css/font-awesome.css" rel="stylesheet"/>

    <!-- TABLE STYLES-->
    <link href="/report/resources/assets/js/dataTables/dataTables.bootstrap.css" rel="stylesheet"/>

    <!-- 引入分页CSS -->
    <link rel="stylesheet" href="/report/resources/assets/plugins/page/page.css">
    <!-- 引入分页js -->
    <script src="/report/resources/assets/plugins/page/page.js"></script>
</head>

【3】get、post请求处理

【4】基础问题说明

​ 项目导入时pom.xml文件报错,可能是相关maven依赖导入出错,定位到指定的出错位置,随后将相应的maven仓库中的数据进行清理重新保存加载,或者是通过更换不同版本的maven依赖进行尝试,亦或是导入的版本需要依赖相关的jar

image-20201002105211030

​ JFinal版本与JBolt??

​ JFinal版本较低则没有相关包和类,版本过高则出现下面报错信息

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3