在Spring上下文中检索Velocity的邮件模板时出错

时间:2016-03-17 17:27:36

标签: java spring spring-mvc velocity

我在Spring中遇到VelocityEngine问题,我的任务是检索邮件模板。

这是我的配置:

弹簧context.xml中:

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
    <property name="velocityProperties">
        <value>
            resource.loader=file
            file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader
            file.resource.loader.path=${template.path}
            file.resource.loader.cache=${template.cache}
            file.resource.loader.modificationCheckInterval=${template.modificationCheckInterval}
        </value>
    </property>
</bean>

JAVA:

@Autowired
private JavaMailSender javaMailSender;  

@Autowired
private VelocityEngine velocityEngine;

public void sendEMailFromTemplate(String to, String subject, String template, Object object) {
    MimeMessagePreparator mmp = new MimeMessagePreparator() {
        public void prepare(MimeMessage mimeMessage) throws Exception {
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
            message.setFrom(mailFrom);
            message.setTo(to);
            message.setSubject(subject);
            Map<String,Object> model = new HashMap<String,Object>();
            model.put("object", object);
            String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, template, StandardCharsets.UTF_8.name(), model);
            message.setText(text, true);
        }
    };
    this.javaMailSender.send(mmp);
}

当应用程序执行方法“发送”时我得到的错误:

org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler handleUncaughtException - Unexpected error occurred invoking async method 'public void test.EMailService.sendEMailFromTemplate(java.lang.String,java.lang.String,java.lang.String,java.lang.Object)'.
org.springframework.mail.MailPreparationException: Could not prepare mail; nested exception is org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'email.vm'
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:371)
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:350)
    at test.EMailService.sendEMailFromTemplate(EMailService.java:44)
    at test.EMailService$$FastClassBySpringCGLIB$$f6dc0165.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:108)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'email.vm'
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:474)
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:352)
    at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1533)
    at org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:343)
    at org.springframework.ui.velocity.VelocityEngineUtils.mergeTemplate(VelocityEngineUtils.java:71)
    at org.springframework.ui.velocity.VelocityEngineUtils.mergeTemplateIntoString(VelocityEngineUtils.java:112)
    at test.EMailService$1.prepare(MailService.java:41)
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:359)
    ... 9 more

怎么了? 感谢。

2 个答案:

答案 0 :(得分:0)

试试这个

在您的applicationContext.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>
     </bean>


    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="locations">
        <list>
          <value>classpath:velocity.properties</value>
       </list>
      </property>
   </bean>

在你的velocity.properties

  velocity.createAccountVerificationEmailSubject=your subject
  velocity.createAccountVerificationEmailTemplate=yourTemplate.vm

在您的服务中

@Autowired
  private VelocityEngine velocityEngine;

  @Value("${velocity.createAccountVerificationEmailSubject}")
  private String createAccountVerificationEmailSubject;

  @Value("${velocity.createAccountVerificationEmailTemplate}")
  private String createAccountVerificationEmailTemplate;

  @Override
  public void sendCreateAccountVerificationEmail(User user) {
    Email email = new Email();//create an Email object
    email.setTo(user.getEmail());
    email.setSubject(createAccountVerificationEmailSubject);
    Map<String, Object> params = new HashMap<String, Object>();
    params.put(CREATE_ACCOUNT_VERIFICATION_TOKEN_KEY, user.getToken());
    email.setContent(createMessageText(createAccountVerificationEmailTemplate, params));
    sendEmail(email);
  }

  public void sendEmail(final Email email) {
    MimeMessagePreparator preparator = new MimeMessagePreparator() {
      public void prepare(MimeMessage mimeMessage) throws Exception {
        mimeMessage.addRecipients(Message.RecipientType.TO, email.getTo());
        mimeMessage.setSubject(email.getSubject());
        mimeMessage.setSentDate(new Date());
        mimeMessage.setFrom(new InternetAddress("yourFrom"));
        InternetAddress internetAddress = new InternetAddress(email.getFrom());
        internetAddress.setPersonal(email.getFromHeader());
        mimeMessage.setFrom(internetAddress);
        mimeMessage.setText(email.getContent(), CHARSET, MIME_SUBTYPE);
      }
    };

    try {
      mailSender.send(preparator);
    } catch (MailException ex) {
      log.error(ex.getMessage());
    }
  }


  private String createMessageText(String templateName, Map<String, Object> model)   {
    String result = null;
    try {
      result =
          VelocityEngineUtils.mergeTemplateIntoString(velocityEngine,
              templateName, model);
    } catch (VelocityException e) {
      log.error(e.getMessage());
    }
    return result;
  }

希望它有所帮助!

答案 1 :(得分:0)

问题是此属性中设置的值:

file.resource.loader.path = $ {template.path}

“template.path”属性设置了一个带有“\”字符分隔符的路径,因此Spring删除了所有字符分隔符,避开了正确的路径。 用“/”代替“\”我解决了这个问题。

无论如何,谢谢你。