Как настроить Velocity Escape Tool с помощью свойств Spring?
Я создаю электронные письма из шаблонов через Velocity в веб-приложении Spring. Теперь мне нужно бежать HTML НЕКОТОРЫЕ из значений. Я нашел Velocity Escape Tool. Но мне не удалось настроить конфигурацию.
То, что я попробовал, так это (spring 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.
Ответы
Ответ 1
Вы не можете настроить Инструменты непосредственно в VelocityEngine. Вместо этого вы используете то, что когда вы используете VelocityEngineUtils, вы передаете какие-либо Инструменты на карте модели:
ModelMap model = new ModelMap();
model.put("esc", new EscapeTool());
VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, "template.vm", "UTF-8", model)
Или, если вы используете VelocityEngine напрямую, вы можете сделать:
VelocityContext velocityContext = new VelocityContext(model);
velocityEngine.mergeTemplate(templateLocation, encoding, velocityContext, writer);
Ответ 2
Предупреждение: я основываю это на несколько смутных воспоминаниях некоторое время назад. Пробег может меняться.
Некоторые документы Velocity следует читать с точки зрения "как это использовать в VelocityView
?"? Если вы хотите использовать одни и те же функции непосредственно из java-кода, вам нужно изменить несколько деталей. В этом случае я считаю, что вы не создаете Context
правильно. Попытайтесь выполнить автономный пример здесь, убедившись, что вы "попросите [ToolManager] создать для вас контекст":
ToolManager manager = ...
Context context = manager.createContext();
Что-то подобное, вероятно, сделано под обложками для вас, если вы используете VelocityView
.
Ответ 3
Вот код, который я только что получил. Я обнаружил, что стандартные инструменты автоматически настраиваются ToolManager.
@Autowired
private VelocityEngine velocityEngine;
public void createHtml(String templateLocation, Map<String, Object> model) throws Exception {
ToolManager toolManager = new ToolManager();
ToolContext toolContext = toolManager.createContext();
VelocityContext velocityContext = new VelocityContext(model, toolContext);
StringWriter resultWriter = new StringWriter();
velocityEngine.mergeTemplate(templateLocation, "UTF-8", velocityContext, resultWriter);
String html = resultWriter.toString();
// use the HTML here
}
И мой шаблон имеет этот
<p>Dear $esc.html($customer.firstname)</p>
Ответ 4
- Добавить зависимость maven от скорости в pom или добавить jar в путь класса.
-
Добавить объект инструмента возврата в контексте скорости.
[context.put( "escapeTool", новый EscapeTool())]
-
Используйте escapeTool в шаблоне.
[$ escapeTool.xml(значение_to_be_escaped)]
Ответ 5
измените это:
<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>
в
<property name="velocityProperties">
<value>
input.encoding=UTF-8
output.encoding=UTF-8
tools.toolbox=application
tools.application.esc=org.apache.velocity.tools.generic.EscapeTool
</value>
</property>