Как использовать скорость 1.7 с пружиной - PullRequest
6 голосов
/ 05 марта 2012

Я использую скорость 1.7 в рамках Spring 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>

Пожалуйста, помогите мне. Есть ли какие-либо другие конфигурации, которые мне нужно сделать?

Ответы [ 3 ]

9 голосов
/ 22 июня 2012

У меня была такая же проблема при использовании. Я мог бы решить это следующим образом:

@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, поэтому я вместо этого использовал Autowired в своем объявлении VelocityConfigurer и вызвал для этого getVelocityEngine ().

Я обнаружил, что, если он автоматически подключается к @ Service-s или @ Component-s и вы объявили в общем файле applicationContext.xml, то объявление xml должно быть также в этом общем applicationContext.xml а не конфиг xxx-servlet.xml.

Я думаю, это потому, что applicationContext.xml является общим для всех сервлетов в приложении, поэтому он должен быть полностью обработан до того, как появятся файлы xxx-servlet.xml.

В качестве альтернативы, вы можете включить отладку фабрики Spring Bean и посмотреть, есть ли у нее проблемы с ее созданием:

log4j.category.org.springframework.beans.factory=DEBUG
5 голосов
/ 05 марта 2012

Я думаю, вы не можете использовать @Autowired со статическим полем.Вы можете обойти это с помощью нестатического установщика:

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

или другим способом, но я настоятельно рекомендую превратить EmailUtils в нестатический компонент.Spring гораздо лучше обрабатывает нестатические компоненты (без уродливых хаков), можно будет менять реализации, и ваш код будет придерживаться философии DI.

1 голос
/ 01 декабря 2015

Это моя попытка, я инициализирую bean-компонент "SpeedEngine" вручную через ClassPathXmlApplicationContext:

Spring application-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, того же уровня, что и application-context.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,

Это код Java:

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,
...