开发者社区> 问答> 正文

beetl 模板问题?报错

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

我现在有两个实体类,两个实体类的属性名称,但类型不一样,在使用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)
<p>
	<br>
</p>
<p>
	<br>
</p>


展开
收起
爱吃鱼的程序员 2020-06-14 15:57:22 731 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

    directivedynamicxxxx;

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


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

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

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

    2020-06-14 15:57:39
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载