Velocity 2无法设置属性:Spring3升级至Spring5.0.5遇技术问题
Spring 3 升级到 Spring 5.0.5 后的 Velocity 初始化配置指南
针对你从Spring 3升级到Spring 5.0.5时编写的Velocity初始化代码,我整理了几个关键注意点和优化建议,帮你平稳完成升级:
一、先确认依赖兼容性
Spring 5对Velocity的支持依赖于**Velocity 1.7+**版本,同时需要注意排除旧版本依赖冲突(比如Spring 3可能自带的低版本Velocity或commons-collections)。完整的依赖配置建议如下:
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> <!-- 排除旧版commons-collections,避免与Spring 5依赖的commons-collections4冲突 --> <exclusions> <exclusion> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> </exclusion> </exclusions> </dependency> <!-- 如果需要Spring提供的Velocity工具类(比如VelocityEngineFactoryBean),需引入此依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.0.5.RELEASE</version> </dependency>
二、优化你的手动初始化代码
你的初始化逻辑本身没问题,但可以补充编码配置避免中文乱码,同时确保类路径加载器的全类名准确:
private static void initVelocity() throws VelocityException, IOException { Properties props = new Properties(); // 指定资源加载器为classpath props.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); // 注意:这里要写完整的类路径,避免类找不到的问题 props.setProperty("classpath.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); // 补充编码配置,解决模板中文乱码问题 props.setProperty(RuntimeConstants.INPUT_ENCODING, "UTF-8"); props.setProperty(RuntimeConstants.OUTPUT_ENCODING, "UTF-8"); // 确保仅初始化一次(可以用单例模式或者Spring bean管理来避免重复调用) if (!Velocity.getResourceLoader().isInitialized()) { Velocity.init(props); } }
三、更推荐Spring风格的配置方式
在Spring环境中,更建议使用VelocityEngineFactoryBean来管理Velocity引擎,这样可以利用Spring的依赖注入机制,避免手动初始化的繁琐:
@Configuration public class VelocityConfig { @Bean public VelocityEngine velocityEngine() throws IOException { VelocityEngineFactoryBean factoryBean = new VelocityEngineFactoryBean(); Properties velocityProps = new Properties(); velocityProps.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); velocityProps.setProperty("classpath.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); velocityProps.setProperty(RuntimeConstants.INPUT_ENCODING, "UTF-8"); velocityProps.setProperty(RuntimeConstants.OUTPUT_ENCODING, "UTF-8"); factoryBean.setVelocityProperties(velocityProps); return factoryBean.createVelocityEngine(); } }
之后你就可以在需要使用Velocity的地方直接注入VelocityEngine即可,无需手动调用初始化方法。
四、额外注意事项
- Spring 5中
VelocityView(用于模板视图渲染)已被标记为@Deprecated,如果你的项目用到了视图层的Velocity渲染,建议后续逐步迁移到Thymeleaf等更现代的模板引擎,但当前版本仍可正常使用。 - 检查项目中是否有其他依赖Velocity的组件(比如邮件模板、代码生成工具),确保它们也适配Velocity 1.7版本。
内容的提问来源于stack exchange,提问作者Neo87
相关产品推荐
相关产品推荐

