Freemarker 自定义指令/函数 踩坑

2020-08-28  本文已影响0人  马克_唐卡

需求:

base64( base64( "data1": ${data1 } ): base64( "data2": ${data2} ) )

开发环境

需求调研

需求实现

<!-- freemarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>
class Base64Method : TemplateMethodModelEx {
    override fun exec(data: MutableList<Any?>): Any {
        return String(Base64.getEncoder().encode(data[0].toString().toByteArray(Charsets.UTF_8).clone()))
    }
}
@Test
    @Transactional
    fun tempalteTest() {
        val stringLoader = StringTemplateLoader()
        val templateValue: String = "<#list data1 as dataType1>\n" +
                "'type1://\${base64(\"\${data1.userName}:\${data1.password}\")}'\n" +
                "</#list>\n" +
                "<#list data2 as dataType2>\n" +
                "'type2://\${base64\"{\"userName\":\"\${data2.nodeName}\",\"password\":\"\${data2.password}\"}\")}'\n" +
                "</#list>\n" +
                "<#list data3 as dataType2>\n" +
                "'type3://\${base64(\"\${data3.userName}@\${data3.password}\")}'\n" +
                "</#list>"
        stringLoader.putTemplate("myTemplate", templateValue)
        val configuration = Configuration(Configuration.getVersion())
        configuration.defaultEncoding = "utf-8"
        configuration.setSharedVariable("base64", Base64Method());
//        configuration.setSharedVariable("base66", Base64Directive()); // 不满足需求,遗弃
        configuration.templateLoader = stringLoader

        val template = configuration.getTemplate("myTemplate", "utf-8")

        //向数据集中添加数据
        val dataModel: MutableMap<String, MutableList<Map<String, String>>> = mutableMapOf()
        val type1: MutableList<Map<String, String>> = mutableListOf()
        val type2: MutableList<Map<String, String>> = mutableListOf()
        val type3: MutableList<Map<String, String>> = mutableListOf()

        val apList = HttpUtil.get("https://xxx.xxx") // 获取后端数据

        // 根据后端结果apList 初始化数据
        // type1 初始化
        // type2 初始化
        // type3 初始化

        dataModel["type1"] = type1
        dataModel["type2"] = type2
        dataModel["type3"] = type3

        val out: Writer = StringWriter()
        // 第七步:调用模板对象的process方法输出文件。
        template.process(dataModel, out)
        // 第八步:关闭流。
        var test2 = out.toString()
        out.flush()
        out.close()
    }

未能实现部分

踩的坑

如有错误,请大佬指定,这是一种不完整的解决方式,正在寻求更好的解决方案~

上一篇下一篇

猜你喜欢

热点阅读