麦克斯仇
Think different
159
文章
36873
阅读
首页
INDEX
文章
ARTICLE
关于
ABOUT
扩展FieldGetter使Enjoy在SpringBoot2.4.x中支持下划线取值
创建日期:
2020/08/20
修改日期:
2023/05/19
Java
SpringBoot
SpringMVC
JFinal
## 场景 > 因为想把自己博客再写一个`Springboot+Layui`的版本,以熟悉一下`Springboot`框架,不改前端页面,依旧使用`Enjoy`模板引擎,所以就出现了如下场景 - Enjoy - Spring Boot - MyBatis-Plus - Layui - MySQL > MySQL中字段是下划线,如:`article.create_time` 实体中的字段是驼峰,如:`Article.createTime` 页面中使用Enjoy表达式输出 直接使用`表名.字段名`,如:`#(article.create_time)`,会报如下错误 ```bash 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`的修改 ```java 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`中,添加如下内容 ```java Engine.addFieldGetterToLast(new CamelFieldGetter(null)); ``` ***完毕!收工!***
3
全部评论