20

今天我已经将我的整个 Spring Web 应用程序从使用 Spring 升级3.1.1到 Spring 3.2

我现有应用程序的大部分内容都没有中断,除了在 Spring3.2中,

org.springframework.ui.velocity.VelocityEngineUtils

类似乎已完全从spring-context-3.2.0.RELEASE.jar 中删除

我在这个url中找到了迁移指南。

它表示org.springframework.ui.velocity.VelocityEngineUtils该类刚刚被弃用,但实际上它已被完全删除。

也许我弄错了,我想知道 VelocityEngineUtils 类是否仍然存在于某个地方,或者如果不存在,我可以使用的替代类是什么。

编辑:似乎整个速度包已从 Spring 中删除,3.2所以现在甚至 org.springframework.ui.velocity.VelocityEngineFactoryBean不存在。Spring正在远离Velocity吗?

4

4 回答 4

34

我想添加一个完整的答案。

首先,添加依赖项:

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.6.4</version>
</dependency>

那么,如果你有这样的习惯VelocityEngineFactory

@Bean
public VelocityEngineFactory velocityEngine(){
    VelocityEngineFactoryBean bean = new VelocityEngineFactoryBean();
    Properties properties = new Properties();
    properties.setProperty("input.encoding", "UTF-8");
    properties.setProperty("output.encoding", "UTF-8");
    properties.setProperty("resource.loader", "class");
    properties.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
    bean.setVelocityProperties(properties);
    return bean;
}

您需要将其替换为 bean 定义,如下所示(在您的@Configuration课程中);下面的定义允许您从类路径加载模板。

@Bean
public VelocityEngine velocityEngine() throws Exception {
    Properties properties = new Properties();
    properties.setProperty("input.encoding", "UTF-8");
    properties.setProperty("output.encoding", "UTF-8");
    properties.setProperty("resource.loader", "class");
    properties.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
    VelocityEngine velocityEngine = new VelocityEngine(properties);
    return velocityEngine;
}

最后,将其用作:(registration.vm可在类路径中找到)

@Autowired
private VelocityEngine velocityEngine;

public String prepareRegistrationEmailText(User user) {
    VelocityContext context = new VelocityContext();
    context.put("username", user.getUsername());
    context.put("email", user.getEmail());
    StringWriter stringWriter = new StringWriter();
    velocityEngine.mergeTemplate("registration.vm", "UTF-8", context, stringWriter);
    String text = stringWriter.toString();
    return text;
}

祝你好运。

于 2017-02-20T16:44:21.350 回答
18

关于 Spring 中 VelocityEngineUtils 的弃用,Spring 文档对使用什么不是很清楚。

它只是说:

已弃用。请改用 mergeTemplateIntoString(VelocityEngine, String, String, Map),遵循 Velocity 1.6 在其自己的 API 中的相应弃用。

为了使它更加混乱,该链接引用自身。

基本上它只是说使用 Velocity 本身。

这是你如何做到这一点的描述..

 // instead of a model map, you use a VelocityContext

 VelocityContext velocityContext = new VelocityContext();
 velocityContext.put("key1", value1);
 velocityContext.put("key2", value2);

 // the velocityEngine you wired into Spring has a mergeTemplate function
 // you can use to do the same thing as VelocityEngineUtils.mergeTemplate
 // with the exception that it uses a writer instead of returning a String      

 StringWriter stringWriter = new StringWriter();
 velocityEngine.mergeTemplate("templateName.vm", "UTF-8", velocityContext, stringWriter);

 // this is assuming you're sending HTML email using MimeMessageHelper

 message.setText(stringWriter.toString(), true);
于 2016-09-02T17:24:00.117 回答
10

我不认为VelocityEngineUtils是在spring-context罐子里(至少自 Spring 上一个 3.1.x 版本以来没有,根据 GitHub)。

无论如何,你可以找到它spring-context-support-3.2.0.RELEASE.jar

于 2013-01-14T06:58:54.743 回答
1

VelocityEngineUtils 在 spring > 3.2 中被弃用

下面的依赖将完美地工作

<dependency>
            <groupId>com.alibaba.spring</groupId>
            <artifactId>spring-webmvc-velocity</artifactId>
            <version>1.4.3.18.RELEASE</version>
 </dependency>

建议完全弃用 Velocity 并替换为 thymeleaf

于 2020-02-15T09:33:36.963 回答