使用Spring和Velocity选择模板时出现异常。抛出java.lang.NullPointerException

时间:2016-02-24 06:25:18

标签: spring spring-mvc spring-security velocity

我正在尝试使用 Spring Velocity 发送预定义的HTML电子邮件模板。它抛出了这个例外:

java.lang.NullPointerException: 
    null at org.springframework.ui.velocity.VelocityEngineUtils.mergeTemplate(VelocityEngineUtils.java:53)~[spring-context-support-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
    at org.springframework.ui.velocity.VelocityEngineUtils.mergeTemplateIntoString(VelocityEngineUtils.java:92) ~[spring-context-support-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
    at com.incyyte.app.service.MailService.sendReactivationEmail(MailService.java:159) ~[classes/:na]

我的功能实现如下所示:

 public void sendReactivationEmail(Optional<User> user) {
    Locale locale = Locale.forLanguageTag(user.get().getLangKey());
    String websiteURL = messageSource.getMessage("website.url", null, locale);
    String reactivationURL = websiteURL + messageSource.getMessage("activation.url", null, locale);
    String emailSubject = messageSource.getMessage("reactivation.subject", null, locale);
    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("vmTemplate/Reactive_email.vm").getFile());
    Map<String, Object> emailModel = new HashMap<String, Object>();
    emailModel.put("username", user.get().getLogin());
    emailModel.put("activationCode", reactivationURL + user.get().getActivationKey());
    emailModel.put("webURL", websiteURL);
    String content = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, file.getAbsolutePath(), emailModel);
    sendEmail(user.get().getEmail(), emailSubject, content, false, true);
}

我看过文件的绝对路径,它显示为

D:\v2dev\incyyte_version2\appCode\target\classes\vmTemplate\Reactive_email.vm

此处Reactive_email.vm是HTML格式的电子邮件模板。我认为这个异常即将发生,因为Velocity无法读取文件。请帮我跟踪此异常以及如何解决它。

1 个答案:

答案 0 :(得分:0)

您之前不必在File中加载模板。您可以直接将方法mergeTemplateIntoString与模板的路径一起使用。

像这样:

String content = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "vmTemplate/Reactive_email.vm", emailModel);

确保模板位于src/main/resources目录。

希望它能帮到你