Jfinal3.1 Template Engine 解析到第三层异常

使用 jfinal-3.1_demo_for_maven基础代码测试。

package com.demo.index;

import java.util.ArrayList;
import java.util.List;

import com.jfinal.core.Controller;
import com.jfinal.kit.JsonKit;
import com.jfinal.plugin.activerecord.Record;

/**
 * 本 demo 仅表达最为粗浅的 jfinal 用法,更为有价值的实用的企业级用法 详见 JFinal 俱乐部:
 * http://jfinal.com/club
 * 
 * IndexController
 */
public class IndexController extends Controller {
	public void index() {
		//构造数据
		List<Record> databases = new ArrayList<Record>();
		Record db=new Record().set("name", "第一层"); 
		databases.add(db);
		
		List<Record> tables = new ArrayList<Record>();
		Record table=new Record().set("name", "第二层"); 
		tables.add(table);
		db.set("tables", tables);
		
		List<Record> columns = new ArrayList<Record>();
		Record column=new Record().set("name", "第三层"); 
		columns.add(column);
		table.set("columns", columns);
		
		System.out.println(JsonKit.toJson(databases));
		
		setAttr("databases", databases);
		//End
		
		render("index.html");
	}
}
控制台打印数据:
[{"tables":[{"columns":[{"name":"第三层"}],"name":"第二层"}],"name":"第一层"}]
格式化后:
[
    {
        "tables":[
            {
                "columns":[
                    {
                        "name":"第三层"
                    }
                ],
                "name":"第二层"
            }
        ],
        "name":"第一层"
    }
]
index.html

#@layout()
#define main()
<h1>JFinal Demo 项目首页</h1>
<div class="table_box">
	<p>欢迎来到 JFinal极速开发世界!</p>
	
	<br><br><br>
	
	本Demo采用 JFinal Template 作为视图文件。
	点击<a href="/blog"><b>此处</b></a>开始试用Demo。
	
	<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
	<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
	<!-- 测试部分 -->
	#for(d:databases)
	   <h1>#(d) name:#(d.name)</h1>
	   #for(t:d.tables)
	      <h3>#(t)  name:#(t.name)</h3>
	      #for(c:t.columns)
	         <p>#(c) name:#(c.name)</p>
	      #end
	   #end
	#end
	<!--/ 测试部分 -->
</div>
#end

页面输出:

QQ截图20170509220230.jpg

控制台打印信息:
[{"tables":[{"columns":[{"name":"第三层"}],"name":"第二层"}],"name":"第一层"}]

JFinal action report -------- 2017-05-09 22:02:13 ------------------------------
Url         : GET /
Controller  : com.demo.index.IndexController.(IndexController.java:1)
Method      : index
--------------------------------------------------------------------------------

2017-05-09 22:02:13
[ERROR]-[Thread: qtp1651191114-34]-[com.jfinal.core.ActionHandler.handle()]: /
com.jfinal.render.RenderException: com.jfinal.template.TemplateException: Field not found: "c.name" and getter method not found: "c.getName()"
Template: "/index/index.html". Line: 20
	at com.jfinal.render.TemplateRender.render(TemplateRender.java:63)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:99)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:74)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:453)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
	at org.eclipse.jetty.server.Server.handle(Server.java:365)
	at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
	at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926)
	at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
	at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
	at java.lang.Thread.run(Thread.java:745)
Caused by: com.jfinal.template.TemplateException: Field not found: "c.name" and getter method not found: "c.getName()"
Template: "/index/index.html". Line: 20
	at com.jfinal.template.expr.ast.Field.eval(Field.java:111)
	at com.jfinal.template.expr.ast.ExprList.eval(ExprList.java:67)
	at com.jfinal.template.stat.ast.Output.exec(Output.java:46)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:48)
	at com.jfinal.template.stat.ast.For.forIterator(For.java:74)
	at com.jfinal.template.stat.ast.For.exec(For.java:53)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:48)
	at com.jfinal.template.stat.ast.For.forIterator(For.java:74)
	at com.jfinal.template.stat.ast.For.exec(For.java:53)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:48)
	at com.jfinal.template.stat.ast.For.forIterator(For.java:74)
	at com.jfinal.template.stat.ast.For.exec(For.java:53)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:48)
	at com.jfinal.template.stat.ast.Define.call(Define.java:105)
	at com.jfinal.template.stat.ast.Call.exec(Call.java:49)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:48)
	at com.jfinal.template.stat.ast.Define.call(Define.java:105)
	at com.jfinal.template.stat.ast.Call.exec(Call.java:49)
	at com.jfinal.template.stat.ast.StatList.exec(StatList.java:48)
	at com.jfinal.template.Template.render(Template.java:49)
	at com.jfinal.render.TemplateRender.render(TemplateRender.java:61)
	... 25 more

前两层能正确输出对象,到第三层c=com.jfinal.template.stat.ast.ForEntry

评论区

JFinal

2017-05-09 22:46

单步调试跟踪一下,肉眼很难看出来

无为

2017-05-09 23:27

@JFinal 是不是template解析问题?List两层没问题,嵌套三层就有问题了

JFinal

2017-05-09 23:37

@无为 应该不是,不管你多少层,都是同一套代码,如果三层不可以,那么两层肯定也不可以

你试着弄成四层,看第三层是否能出得来,可能是小细节要注意

无为

2017-05-10 13:32

@JFinal 好的,晚上试试

无为

2017-05-10 21:58

@JFinal 找到问题了,第三层的 set columns与Record的private Map columns冲突。不管怎么table.set("columns", columns);,columns的值是不变的,哈。

JFinal

2017-05-11 09:44

@无为 魔板引擎的功能是很可靠的,并且深度打磨过

热门反馈

扫码入社