Как инициализировать Velocity DateTool в spring webapp?

#java #spring #templates #jakarta-mail #velocity

#java #spring #шаблоны #джакарта-почта #скорость

Вопрос:

Недавно мне понадобилось инициализировать Velocity DateTool, чтобы правильно отформатировать дату в полученном электронном письме. Обычно вы делаете это с помощью VelocityContext, однако, поскольку я использовал spring VelocityEngineFactoryBean, настроенный в xml, я должен выяснить — как вы можете инициализировать VelocityContext при использовании VelocityEngineFactoryBean?

Другими словами, моя настройка:

webmvc-config.xml

 <bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
  <property name="velocityProperties">
     <value>
        resource.loader=class
        class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
     </value>
  </property>
  

MailSender.java

 public class CustomMailSender {

@Autowired
private VelocityEngine velocityEngine;

private void sendMail(final Object backingObject) {     
    MimeMessagePreparator preparator = new MimeMessagePreparator() {
        public void prepare(MimeMessage mimeMessage) throws Exception {
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);

            // Set subject, from, to, ....

            // Set model, which then will be used in velocity's mail template
            Map<String, Object> model = new HashMap<String, Object>();
            model.put("backingObject", backingObject);
            String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "mail_template.vm", model);
            message.setText(text, true);

        }
    };
    this.javaMailSender.send(preparator);
}
  

В mail_template.vm вы хотите использовать что-то вроде:

 <li>Transfer start date: $date.format('medium_date', $backingObject.creationDate)</li>
  

Как гарантировать, что DateTool будет правильно инициализирован и использован при разборе шаблона?

Ответ №1:

После нескольких часов поиска это оказывается довольно тривиальным: просто добавьте еще одну строку при инициализации model:

 private void sendMail(final Object backingObject) {     
    MimeMessagePreparator preparator = new MimeMessagePreparator() {
        public void prepare(MimeMessage mimeMessage) throws Exception {
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);

            // Set subject, from, to, ....

            // Set model, which then will be used in velocity's mail template
            Map<String, Object> model = new HashMap<String, Object>();
            model.put("backingObject", backingObject);

            // Add this line in order to initialize DateTool
            model.put("date", new DateTool());

            String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "mail_template.vm", model);
            message.setText(text, true);

        }
    };
    this.javaMailSender.send(preparator);
}
  

После этого вы можете использовать $date внутри вашего шаблона.