2012-03-05 17 views
5

के साथ वेग 1.7 का उपयोग कैसे करें मैं ईमेल भेजने के लिए वेग 1.7 withe वसंत 3.1 ढांचे का उपयोग कर रहा हूँ। ईमेल टेम्पलेट्स के लिए वेग का उपयोग किया जाता है।वसंत

नीचे विन्यास है

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

और नीचे मेरी कोड

@Component 
public class EmailUtils { 

    @Autowired 
    private static VelocityEngine velocityEngine; 

    public static void sendMail(String subject, Map data, String template, 
      String toName, String toAddress) { 


     HtmlEmail email = new HtmlEmail(); 

     try { 
      email.setHostName(hostName); 
      email.setSmtpPort(smtpPort); 
      email.setSubject(subject); 

      System.out.println(template +" template"); 
      System.out.println(data +" data "); 
      System.out.println(velocityEngine +" velocityEngine "); 

      String message = VelocityEngineUtils.mergeTemplateIntoString(
        velocityEngine, template, data); 

      System.out.println(message +" message message "); 

      email.setMsg(message); 
      email.addTo(toAddress, toName); 
      email.setFrom(fromAddress, fromName); 
      email.send(); 
     } catch (EmailException e) { 
      // TODO Auto-generated catch block 

      e.printStackTrace(); 
     } 
    } 
} 

जब मैं आवेदन मैं त्रुटि निम्न मिल चलाया जाता है।

java.lang.NullPointerException 
at org.springframework.ui.velocity.VelocityEngineUtils.mergeTemplate(VelocityEngineUtils.java:58) 

वेग इंजन शून्य है।

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 

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

कृपया मेरी मदद करो। क्या कोई अन्य कॉन्फ़िगरेशन है जो मुझे करने की ज़रूरत है?

+1

आप ठीक ढंग से एक्सएमएल config, और भी एनोटेशन config उपयोग करने के लिए वसंत के लिए कॉन्फ़िगर है? –

+0

आप अपने टेम्पलेट के लिए क्या पास कर रहे हैं? मुझे संदेह है कि वहां कोई समस्या हो सकती है। – JasonG

+0

आशीष, क्या आपने एनोटेशन कॉन्फ़िगरेशन के बारे में nico_ekito की टिप्पणी देखी? क्या आपके पास XML में कहीं भी < 'है? यह आपके नमूना एक्सएमएल विन्यास स्निपेट में नहीं है। – Rup

उत्तर

5

मुझे लगता है कि आप एक स्थिर क्षेत्र के साथ @Autowired का उपयोग नहीं कर सकते हैं। आप इस के चारों ओर एक गैर स्थिर सेटर के साथ काम कर सकते हैं:

@Autowired 
public void setVelocityEngine(VelocityEngine ve) { 
    EmailUtils.velocityEngine = ve; 
} 

या किसी अन्य तरीके से, लेकिन मैं दृढ़ता से एक गैर स्थिर सेम में EmailUtils मोड़ की सिफारिश करेंगे। वसंत गैर स्थैतिक घटकों को बहुत बेहतर संभालता है (कोई बदसूरत हैक की आवश्यकता नहीं है), कार्यान्वयन स्वैप करना संभव होगा और आपका कोड DI दर्शन के साथ चिपकेगा।

+0

हाय उत्तर के लिए धन्यवाद। जैसा आपने कहा था वैसा ही हटा दिया। अब मुझे निर्भरता के लिए मिली कोई वस्तु मिलान नहीं है [org.apache.velocity.app.VelocityEngine] निर्भरता: कम से कम 1 बीन की उम्मीद है जो इस निर्भरता के लिए ऑटोवायर उम्मीदवार के रूप में अर्हता प्राप्त करता है। आवेदन तैनात करते समय। कृपया मदद करे। – ashishjmeshram

+0

'VelocityEngineFactoryBean'' VelocityEngine' प्रकार की वस्तु उत्पन्न करता है। आप संदर्भ फ़ाइलों को लोड करने के लिए कैसे इंगित करते हैं? – mrembisz

+0

मुझे अभी भी एक ही त्रुटि मिल रही है। – ashishjmeshram

8

मुझे उपयोग करते समय एक ही समस्या थी। मैं निम्नलिखित तरीके से इसे हल कर सकता है:

@Configuration 
public class ApplicationConfiguration { 

    @Bean 
    public VelocityEngine getVelocityEngine() throws VelocityException, IOException{ 
     VelocityEngineFactory factory = new VelocityEngineFactory(); 
     Properties props = new Properties(); 
     props.put("resource.loader", "class"); 
     props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); 
     factory.setVelocityProperties(props); 
     return factory.createVelocityEngine();  
    } 
} 

लेकिन बजाय - क्योंकि मैं अपने विचारों के लिए वेग टेम्पलेट का उपयोग कर रहा था और पहले से ही एक VelocityConfigurer की घोषणा की थी, तो मैं बजाय VelocityConfigurer की मेरी घोषणा में Autowired और getVelocityEngine कहा जाता है() उस पर।

मुझे पता चला है कि, अगर इसे @ सेवा-एस या @ घटक में स्वचालित किया जा रहा है और आपने एक साझा अनुप्रयोग Context.xml फ़ाइल में घोषित किया है, तो एक्सएमएल घोषणा उस साझा एप्लिकेशन Context.xml में होनी चाहिए xxx-servlet.xml कॉन्फ़िगरेशन के बजाए ठीक है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि applicationContext.xml को एप्लिकेशन में सभी सर्वलेट्स के बीच साझा किया जाता है, इसलिए इसे xxx-servlet.xml फ़ाइलों से पहले पूरी तरह संसाधित किया जाना चाहिए।

वैकल्पिक रूप से, आप वसंत सेम कारखाने डिबगिंग सक्षम हो सकता है और अगर यह किसी भी मुद्दे यह instantiating होने के दौरान दिखाई दे:

log4j.category.org.springframework.beans.factory=DEBUG 
1

यह मेरा प्रयास है, मैं "velocityEngine" सेम मैन्युअल रूप से प्रारंभ ClassPathXmlApplicationContext के माध्यम से:

स्प्रिंग आवेदन-context.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> 

यह मेरा template_text.vm है, classpath, के रूप में आवेदन-Conte एक ही स्तर में रख xt.xml।

Dear $userName, 

You have made the following request on $userTime. 

#if($isFileMissing) 
Missing file(s) found in home directory: 
#foreach($missingFile in $missingFiles) 
- $missingFile 
#end 
#end 

Best regards, 

यह जावा कोड है:

public static void main(String[] args) throws Exception { 
    String[] springConfig = {"application-context.xml"}; 
    org.springframework.context.ApplicationContext context = new org.springframework.context.support.ClassPathXmlApplicationContext(springConfig); 

    java.util.Map<String, Object> model = new java.util.HashMap<String, Object>(); 
    model.put("userName", "John Low"); 
    model.put("userTime", "2015-10-28 23:59:59"); 
    model.put("isFileMissing", true); 
    model.put("missingFiles", new String[] {"line 1", "line 2", "line 3"}); 
    String text = org.springframework.ui.velocity.VelocityEngineUtils.mergeTemplateIntoString((VelocityEngine)context.getBean("velocityEngine"), "/template_text.vm", "UTF-8", model); 
    System.out.println(text); 
} 

उत्पादन:

Dear John Low, 

You have made the following request on 2015-10-28 23:59:59. 

Missing file(s) found in home directory: 
- file 1 
- file AAA 
- line 3 

Best regards,