2016-06-29 2 views
1

mir bitte helfen, ein Problem zu beheben:Senden Freemarker Templat E-Mail

 @Service 
public class MailSenderServiceImpl implements MailSenderService { 
    private static final Logger logger = LoggerFactory.getLogger(MailSenderServiceImpl.class); 
    @Autowired 
    private JavaMailSender javaMailSender; 
    @Autowired 
    Configuration freemarkerConfiguration; 
@Override 
    public void sendTemplatedEmail(String to, String from, String template, Map<String, Object> templatedMimeMessage) 
      throws IOException { 
     FileTemplateLoader templateLoader = new FileTemplateLoader(new File("src/main/resources")); 
     freemarkerConfiguration.setTemplateLoader(templateLoader); 
     MimeMessagePreparator preparator; 
     try { 
      preparator = new MimeMessagePreparator() { 

       // Generate a string from the template 
       String messageText = FreeMarkerTemplateUtils.processTemplateIntoString(
         freemarkerConfiguration.getTemplate(template), templatedMimeMessage); 

       @Override 
       public void prepare(MimeMessage message) throws Exception { 
        MimeMessageHelper helper = new MimeMessageHelper(message, true); 
        helper.setTo(to); 
        helper.setFrom(from); 
        helper.setText(messageText, true); 
       } 
      }; 
      Assert.notNull(javaMailSender, "javaMailSender must not be null"); 
      this.javaMailSender.send(preparator); 

     } catch (Exception ex) { 
      logger.error("Failed to send email for templated message:" + 
         "\nFrom:" + from + 
         "\nTo:" + to + 
         "\nMessageMap:" + templatedMimeMessage, ex); 

     } 

    } } 

Hier ist ein Integrationstest:

` @Test 
    public void sendTemplatedEmail() throws IOException { 

     EmailTemplate template = createEmailTemplateObj("Test subject 111111", "Test body 11111111", 
       TemplateType.TENANT_CREATION); 

     // Send message using Free Marker template 
     Map<String, Object> freeMarkderTemplateMap = new HashMap<String, Object>(); 
     freeMarkderTemplateMap.put("subject", template.getSubject()); 
     freeMarkderTemplateMap.put("body", template.getBody()); 

     mailSenderService.sendTemplatedEmail("[email protected]", "[email protected]", 
       "email.ftl", freeMarkderTemplateMap); 
    }` 

Mein Test nicht bestanden hat, erhalte ich Vorlage „email.ftl "nicht gefunden Ausnahme, aber es existiert unter src/main/resources. Ich bin nicht hinzugefügt

<bean id="freeMarkerConfiguration" class="freemarker.template.Configuration" factory-bean="freeMarkerConfigurationFactory" factory-method="createConfiguration" scope="prototype"/> 

in spring.xml. Angenommen, das ist nicht der Grund.

Antwort

2

Das "src" -Verzeichnis ist für die Entwickler-Tools, nicht für die laufende Anwendung, also sollten Sie niemals "src" in Ihrem Quellcode haben. Außerdem laden Sie hier nicht Files, sondern Klassenladerressourcen. Verwenden Sie daher ClassTemplateLoader, und geben Sie den Pfad relativ zu src/main/resources an. Also in Ihrem Fall wäre es new ClassTemplateLoader(SomeClass.class, "/"), aber es ist schöner, ein Unterverzeichnis wie src/main/resources/com/example/myproject/templates zu erstellen, in diesem Fall wird das Argument "/com/example/myproject/templates" sein.

Eine andere Sache ... Die freemarkerConfiguration darf nicht in sendTemplatedEmail geändert werden. Wie jede andere Singleton-Bean sollte sie beim Start der Anwendung vollständig konfiguriert werden.