扩展FieldGetter使Enjoy在Springboot中支持下划线取值

场景

因为想把自己博客再写一个Springboot+Layui的版本,以熟悉一下Springboot框架。在不改前端页面,依旧使用Enjoy模板引擎,所会就出现了如下场景

  • Enjoy

  • Spring Boot

  • MyBatis-Plus

  • Layui

  • MySQL

MySQL中字段是下划线,如:article.create_time
实体中的字段是驼峰,如:Article.createTime
页面中使用Enjoy表达式输出
直接使用表名.字段名,如:#(article.create_time),会报如下错误

public field not found: "article.create_time" and public getter method not found: "article.getCreate_time()"

所以应当使用#(article.createTime)
如果想在页面使用#(article.create_time)获取值,需要如下扩展

开始扩展

创建一个自定义FieldGetter

跟着JFinal波总的指导,创建一个CamelFieldGetter继承FieldGetter

以下代码是对com.jfinal.template.expr.ast.FieldGetters.GetterMethodFieldGetter的修改

import com.jfinal.kit.StrKit;
import com.jfinal.template.expr.ast.ExprList;
import com.jfinal.template.expr.ast.FieldGetter;
import com.jfinal.template.expr.ast.MethodKit;
/**
 * @author Max_Qiu
 */
public class CamelFieldGetter extends FieldGetter {
    protected java.lang.reflect.Method getterMethod;
    public CamelFieldGetter(java.lang.reflect.Method getterMethod) {
        this.getterMethod = getterMethod;
    }
    @Override
    public FieldGetter takeOver(Class<?> targetClass, String fieldName) {
        if (MethodKit.isForbiddenClass(targetClass)) {
            throw new RuntimeException("Forbidden class: " + targetClass.getName());
        }
        // 修改了下面这一行:先转驼峰,在将首字母大写,即可得到getCreateTime
        String getterName = "get" + StrKit.firstCharToUpperCase(StrKit.toCamelCase(fieldName));
        java.lang.reflect.Method[] methodArray = targetClass.getMethods();
        for (java.lang.reflect.Method method : methodArray) {
            if (method.getName().equals(getterName) && method.getParameterCount() == 0) {
                // if (MethodKit.isForbiddenMethod(getterName)) {
                // throw new RuntimeException("Forbidden method: " + getterName);
                // }
                return new CamelFieldGetter(method);
            }
        }
        return null;
    }
    @Override
    public Object get(Object target, String fieldName) throws Exception {
        return getterMethod.invoke(target, ExprList.NULL_OBJECT_ARRAY);
    }
    @Override
    public String toString() {
        return getterMethod.toString();
    }
}

Engine中添加FieldGetter

在自定义的JFinalEnjoyConfig中,添加如下内容

Engine.addFieldGetterToLast(new CamelFieldGetter(null));

完毕!收工!



最后打一个自己博客的广告:原贴链接扩展FieldGetter使Enjoy在Springboot中支持下划线取值

评论区

JFinal

2020-08-22 16:46

这个扩展在 spring boot 下非常实用,如果不是 enjoy 提供了很方便的 FieldGetter 扩展,还真不太方便支持,赞

JFinal

2020-08-22 16:59

补充一下,如果你希望这个加载的优先级是第一个,可以使用:
Engine.addFieldGetterToFirst(new CamelFieldGetter(null));

还可以指定优先级,例如:
Engine.addFieldGetter(3, new CamelFieldGetter(null));

陈云

2020-08-25 17:19

请问下JFinal只有俱乐部吗有没有企业QQ之类的?

陈云

2020-08-25 17:19

Max_Qiu

2020-08-25 17:59

@陈云 JFinal俱乐部付费后可以加入俱乐部QQ群

杜福忠

2020-08-25 19:39

@陈云 QQ群,搜索jfinal 就非常非常多的交流群都是免费的,随便加一个就可以了。俱乐部群是付费群里面大佬多。
image.png

永字诀

2020-08-26 09:08

@杜福忠 还能回复图片?

杜福忠

2020-08-26 09:17

@永字诀 ؏؏ᖗ乛◡乛ᖘ؏؏ 我使用的高级版2333,回头分享一下姿势,基本操作就是 评论可以使用HTML

永字诀

2020-08-26 14:13

@杜福忠 厉害厉害

陈云

2020-08-26 15:37

额 俱乐部关于JFinal有问题都会解决的是吧。