2013-02-06 9 views
6

Sto cercando di utilizzare template Thymeleaf per l'applicazione primavera per inviare la posta, mi prendo il riferimento da qui https://github.com/thymeleaf/thymeleafexamples-springmail/Utilizzando thymeleaf modello per l'invio di posta con la Primavera

Non ricevo alcun errore ma ancora doesn' lavoro ... Sto usando lo stesso codice di github ancora non ho fortuna ... Qualcuno può suggerire come farlo ??

seguito è il metodo che viene utilizzato per inviare la posta ...

public void sendSimpleMail(
     final String recipientName, final String recipientEmail, final Locale locale) 
     throws MessagingException { 
    final Context ctx = new Context(locale); 
    ctx.setVariable("name", recipientName); 
    ctx.setVariable("subscriptionDate", new Date()); 
    ctx.setVariable("hobbies", Arrays.asList("Cinema", "Sports", "Music")); 
    final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); 
    final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "UTF-8"); 
    message.setSubject("Example HTML email (simple)"); 
    message.setFrom("[email protected]"); 
    message.setTo(recipientEmail); 
    // Create the HTML body using Thymeleaf 
    final String htmlContent = this.templateEngine.process("email-simple.html", ctx); 
    message.setText(htmlContent /* isHtml */); 

    // Send email 
    System.out.println("........"); 
    this.mailSender.send(mimeMessage); 
} 

Se rimuovo la linea che sta creando il corpo HTML usando thymeleaf e inviare una mail ordinaria funziona, ma non con il modello ..

Questa è la linea che causa problemi ... solo reindirizzare all'errore pagina

final String htmlContent = this.templateEngine.process("email-simple.html", ctx); 

di seguito è riportato l'errore che sto ottenendo ..

org.thymeleaf.exceptions.TemplateProcessingException: Resource resolution by ServletContext with org.thymeleaf.resourceresolver.ServletContextResourceResolver can only be performed when context implements org.thymeleaf.context.IWebContext [current context: org.thymeleaf.context.Context] 
    at org.thymeleaf.resourceresolver.ServletContextResourceResolver.getResourceAsStream(ServletContextResourceResolver.java:74) 
    at org.thymeleaf.TemplateParser.parseDocument(TemplateParser.java:254) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:812) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:769) 
    at com.ivb.coep.other.EmailService.sendSimpleMail(EmailService.java:72) 
    at com.ivb.coep.controller.MainController.sendTextMail(MainController.java:83) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

risposta

8

ho ottenuto che funziona finalmente ... Ho cambiato la seguente linea

final Context ctx = new Context(locale); 

con

final WebContext ctx = new WebContext(request,request.getContext(),locale); 

Ora sono in grado di inviare qualsiasi modello o un allegato qualsiasi cosa funziona alla grande .. !!

+4

So che questa è una risposta vecchia, ma un motivo per non seguire questa strada è che sarete dipende la richiesta come gadha @real menzionato. Questo potrebbe andar bene per un'applicazione di test, ma se in seguito utilizzi la struttura ApplicationEvent di Spring per ascoltare eventi e fire email mentre svolgi altre logiche, potresti non avere accesso alla richiesta. – bphilipnyc

3

Si verifica questo problema perché, a quanto pare, non si dispone di una cartella di posta all'interno della cartella delle cartelle WEB-INF /.

In base alla configurazione indicata di seguito, è prevista una cartella di posta all'interno della cartella delle cartelle WEB-INF /.

<bean id="emailTemplateResolver"  class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver"> 
    <property name="prefix" value="mail/" /> 
    <property name="templateMode" value="HTML5" /> 
    <property name="characterEncoding" value="UTF-8" /> 
    <property name="order" value="1" /> 
    <!-- Template cache is true by default. Set to false if you want --> 
    <!-- templates to be automatically updated when modified.  --> 
    <property name="cacheable" value="true" /> 
</bean> 

Quindi, creare una cartella con il nome "mail" all'interno della cartella "resouces" e mantenere i modelli di posta all'interno della cartella "posta". Assicurati di avere questa cartella "mail" all'interno della cartella WEB-INF/classes durante la distribuzione. Questo dovrebbe risolvere il tuo problema

IMO, non dovremmo usare WebContext in quanto richiede un oggetto "richiesta" e l'accoppiamento forte della posta con la richiesta non è una buona idea.

0

Se si desidera individuare i modelli da qualche parte sotto/WEB-INF/ma non si desidera utilizzare ServletContextTemplateResolver, quindi provare SpringResourceTemplateResolver, ad es.

TemplateResolver templateResolver = new SpringResourceTemplateResolver(); 
templateResolver.setPrefix("/WEB-INF/mailtemplates/");