beetl 模板问题

发布于 2021-11-24 23:14:32 字数 4971 浏览 852 评论 3

@闲.大赋 你好,想跟你请教个问题:

我现在有两个实体类,两个实体类的属性名称,但类型不一样,在使用beetl时,使用同一个数据模板,程序根据数据传入不同的实体类,比如:

模板

data是个Map key 是Integer value 根据类型可能是IndicatorDataNum 或者 IndicatorData 类形

<tr>
				<td colspan="2" style="width: 124px;height: 17px;" class="a592167735D68578B951BD5A06B00DB91" rowHid="13" colHid="0" readHid="true">项目开工时间
				</td>
				<td colspan="5" style="width: 310px;height: 17px;" class="a287B02DC9C8468352434D5A1D2B4B2D5" rowHid="13" colHid="2" readHid="false" indicatorId="411">
					<input type="text" name="411.current" value="${data[411].current!}" id="row-13-f3" class="text " indicator-name="项目开工时间" indicator-desc=""/>
				</td>
				<td colspan="2" style="width: 124px;height: 17px;" class="a592167735D68578B951BD5A06B00DB91" rowHid="13" colHid="7" readHid="true">投产时间
				</td>
				<td colspan="4" style="width: 248px;height: 17px;" class="a287B02DC9C8468352434D5A1D2B4B2D5" rowHid="13" colHid="9" readHid="false" indicatorId="412">
					<input type="text" name="412.current" value="${data[412].current!}" id="row-13-f10" class="text " indicator-name="投产时间" indicator-desc=""/>
				</td>
			</tr>
			<tr>
				<td colspan="2" style="width: 124px;height: 17px;" class="a592167735D68578B951BD5A06B00DB91" rowHid="14" colHid="0" readHid="true">达产时间
				</td>
				<td colspan="11" style="width: 682px;height: 17px;" class="a287B02DC9C8468352434D5A1D2B4B2D5" rowHid="14" colHid="2" readHid="false" indicatorId="413">
					<input type="text" name="413.current" value="${data[413].current!}" id="row-14-f3" class="text " indicator-name="达产时间" indicator-desc=""/>
				</td>
			</tr>




实体类

@Data
	public static class IndicatorData {

		/** 本期 */
		private String current;
		/** 上期 */
		private String prior;

		/** 1(月,季)-本期 */
		private String currentTotal;
		/** 1(月,季)-上期 */
		private String priorTotal;
		/** 上年同期 */
		private String lastYearCurrent;
		/** 上年1(月,季)-上年同期 */
		private String lastYearCurrentTotal;
	}

	@Data
	public static class IndicatorDataNum {

		/** 本期 */
		private Integer current;
		/** 上期 */
		private Integer prior;

		/** 1(月,季)-本期 */
		private Integer currentTotal;
		/** 1(月,季)-上期 */
		private Integer priorTotal;
		/** 上年同期 */
		private Integer lastYearCurrent;
		/** 上年1(月,季)-上年同期 */
		private Integer lastYearCurrentTotal;
	}



使用时会报错,可能在打开第一个模板没错,第二模板就报错,是不是因为beetl生成java类,强转错误,能否取消生成java类,错误信息如下:
java.lang.ClassCastException: cn.**.IndicatorData cannot be cast to cn.**.IndicatorDataNum
	at cn.**.IndicatorDataNum_current.value(Unknown Source)
	at org.beetl.core.statement.VarAttribute.evaluate(VarAttribute.java:59)
	at org.beetl.core.statement.VarRef.evaluate(VarRef.java:127)
	at org.beetl.core.statement.PlaceholderST.execute(PlaceholderST.java:32)
	at org.beetl.core.statement.Program.execute(Program.java:70)
	at org.beetl.core.Template.renderTo(Template.java:123)
	at org.beetl.core.Template.renderTo(Template.java:89)

下面是简单的例子也报错

//模板
String templateStr = "${data[1].current!}";

Map<Integer, IndicatorData> tempData = Maps.newHashMap();
		IndicatorData d = new IndicatorData();
		d.current = "strCurrent";
		tempData.put(1, d);
for (int i = 0; i < 5; i++) {
			Template template = gt.getTemplate(templateStr);
			template.binding("data", tempData);

			System.out.println(template.render());
}
//到这里渲染都可以成功

Map<Integer, IndicatorDataNum> numdDta = Maps.newHashMap();
		IndicatorDataNum numData = new IndicatorDataNum();
		numData.current = 120;
		numdDta.put(1, numData);

//到这里就报错了
for (int i = 0; i < 5; i++) {
			Template template = gt.getTemplate(templateStr);
			template.binding("data", numdDta);

			System.out.println(template.render());
		}
错误信息
java.lang.ClassCastException: lulu.code_lab.framework.beetl.HelloWorldTest$IndicatorDataNum cannot be cast to lulu.code_lab.framework.beetl.HelloWorldTest$IndicatorData
	at lulu.code_lab.framework.beetl.HelloWorldTest$IndicatorData_current.value(Unknown Source)
	at org.beetl.core.statement.VarAttribute.evaluate(VarAttribute.java:59)
	at org.beetl.core.statement.VarRef.evaluate(VarRef.java:127)
	at org.beetl.core.statement.PlaceholderST.execute(PlaceholderST.java:32)
	at org.beetl.core.statement.Program.execute(Program.java:70)
	at org.beetl.core.Template.renderTo(Template.java:137)
	at org.beetl.core.Template.renderTo(Template.java:90)
	at org.beetl.core.Template.render(Template.java:77)




如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

悟红尘 2021-11-29 15:19:30

我的页面很多,directive dynamic xxxx; 这个感觉比较麻烦

你也可以取消此默认设置  取消哪个设置

少女情怀诗 2021-11-29 15:07:16

你也可以取消此默认设置,不过一般只有少数页面是这样,用
dynamic 就可以了

剑心龙吟 2021-11-29 08:58:22

得申明绑定类型是动态的,beetl默认假设绑定是静态的,你需要在模板使用此变前:

directive dynamic xxxx;

xxx 是变量名,具体可以参考文档2.25

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文