freemarkder 生成doc文档提示xml字符非法

崩溃现场

freemarkder 生成doc文档提示xml字符非法_第1张图片

环境

信息 备注
idea 2018.03.08
freemarker 2.3.4
工程编码 GBK

直接贴修改后代码

/** 
* 初始化配置
*/
    private void init(String basePackage, String templateName) throws Exception {
		Configuration config = new Configuration();
        config.setDefaultEncoding(defaultEncoding);
        config.setEncoding(Locale.CHINA, defaultEncoding);
        config.setOutputEncoding(defaultEncoding);
        config.setDirectoryForTemplateLoading(new File(basePackage));
        //模板名称获取模板
		template = config.getTemplate(templateName);
	}

    /**
     * 生成文档
     */
	public <K, V> void doExport(String outFilePath, Map<K, V> contentMap) throws TemplateException, IOException {
        File file = new File(outFilePath);
        OutputStream outputStream = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, defaultEncoding);
        //对模板进行数据填充
	    template.process(contentMap, outputStreamWriter);
        outputStream.close();
        outputStreamWriter.close();
	}

原因分析

  1. 在自己搭建的测试工程中功能正常、排除freemarker版本问题
  2. 百度驱动开发,怀疑是编码问题
  3. 强行修改初始化配置中编码设置,包括setDefaultEncodingsetEncodingsetOutputEncoding,然而无任何改善
  4. 冷静后排查生成文档代码,定位到问题原因
修改前:
template.process(contentMap, new OutputStreamWriter(outputStream));

修改后:
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, defaultEncoding);
//对模板进行数据填充
template.process(contentMap, outputStreamWriter);

这是修改后的代码,而原因就是: OutputStreamWriter未指定编码。这个类估计按照工程编码当做默认编码格式。

你可能感兴趣的:(随笔)