Я создаю электронные письма из шаблонов через Velocity в веб-приложении Spring.Теперь мне нужно, чтобы HTML экранировал некоторые значения.Я нашел Velocity Escape Tool .Но у меня не работала конфигурация.
Что я пробовал, так что тариф (весна applicationContext.xml):
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath" value="classpath:/velocity/emailTemplates" />
<property name="preferFileSystemAccess" value="false" />
<property name="overrideLogging" value="true" />
<property name="velocityProperties">
<util:properties>
<prop key="input.encoding">UTF-8</prop>
<prop key="output.encoding">UTF-8</prop>
<prop key="tools.toolbox">application</prop>
<prop key="tools.application.esc">org.apache.velocity.tools.generic.EscapeTool</prop>
</util:properties>
</property>
</bean>
Шаблон (htmlEscapeTest.vm):
with escape: $esc.html($needEscape)
TestCase:
@Test
public void testHtmlEscapingSupport() {
final String needEscape = "<test>";
ModelMap model = new ModelMap();
model.addAttribute("needEscape", needEscape);
String result = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, HTML_ESCAPING_TEMPLATE_FILE, model);
assertThat(result, StringContains.containsString("<test>"));
}
Но тест не пройден, ...got: "with escape: $esc.html($needEscape)"
Кто-нибудь может подсказать, что я делаю неправильно?
Если я добавлю new EscapeTool()
explicite в тесте:
VelocityContext velocityContext = new VelocityContext(model);
velocityContext.put("esc", new EscapeTool());
StringWriter writer = new StringWriter();
velocityEngine.mergeTemplate(HTML_ESCAPING_TEMPLATE_FILE, velocityContext, writer);
String result = writer.toString();
, то он работает.Но, насколько я понимаю, документация должна быть настроена один раз в файле свойств.
Я использую Velocity Engine 1.7 и Velocity Tools 2.0.