文档章节

Spring boot 1.2.5.RELEASE 使用velocity模板中文乱码问题

活的自由
 活的自由
发布于 2015/09/21 20:57
字数 512
阅读 2061
收藏 6

application.properties文件:

spring.velocity.resourceLoaderPath=classpath:/templates/
spring.velocity.prefix=
spring.velocity.suffix=.vm
spring.velocity.cache=false
spring.velocity.check-template-location=true
spring.velocity.charset=UTF-8
spring.velocity.content-type=text/html

在使用spring boot开发中,虽然设置了编码,但是spring boot的这个版本还是会产生中文乱码,但是使用freemarker模板就没有问题,解决方法就是写一个VelocityAutoConfiguration.java文件放在工程中,覆盖掉spring boot 中的VelocityAutoConfiguration类,包名:

package org.springframework.boot.autoconfigure.velocity;

文件内容从spring boot源码中拷贝出来放在自己的工程,包名和文件名一样,修改的内容只需要在applyProperties添加一行代码:


velocityProperties.setProperty("input.encoding", this.properties.getCharset());
修改后的applyProperties方法如下:
protected void applyProperties(VelocityEngineFactory factory) {
	factory.setResourceLoaderPath(this.properties.getResourceLoaderPath());
	factory.setPreferFileSystemAccess(this.properties.isPreferFileSystemAccess());
	Properties velocityProperties = new Properties();
	velocityProperties.putAll(this.properties.getProperties());
	velocityProperties.setProperty("input.encoding", this.properties.getCharset());
	factory.setVelocityProperties(velocityProperties);
}


文件完整内容,保存到工程中就可以:

/*
 * Copyright 2012-2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.autoconfigure.velocity;

import java.io.IOException;
import java.util.Properties;

import javax.annotation.PostConstruct;
import javax.servlet.Servlet;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.VelocityException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.template.TemplateLocation;
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.view.velocity.EmbeddedVelocityViewResolver;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ui.velocity.VelocityEngineFactory;
import org.springframework.ui.velocity.VelocityEngineFactoryBean;
import org.springframework.util.Assert;
import org.springframework.web.servlet.view.velocity.VelocityConfig;
import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
import org.springframework.web.servlet.view.velocity.VelocityViewResolver;

/**
 * {@link EnableAutoConfiguration Auto-configuration} for Velocity.
 *
 * @author Andy Wilkinson
 * @since 1.1.0
 */
@Configuration
@ConditionalOnClass({ VelocityEngine.class, VelocityEngineFactory.class })
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
@EnableConfigurationProperties(VelocityProperties.class)
public class VelocityAutoConfiguration {

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private VelocityProperties properties;

    @PostConstruct
    public void checkTemplateLocationExists() {
        if (this.properties.isCheckTemplateLocation()) {
            TemplateLocation location = new TemplateLocation(
                    this.properties.getResourceLoaderPath());
            Assert.state(location.exists(this.applicationContext),
                    "Cannot find template location: " + location
                            + " (please add some templates, check your Velocity "
                            + "configuration, or set spring.velocity."
                            + "checkTemplateLocation=false)");
        }
    }

    protected static class VelocityConfiguration {

        @Autowired
        protected VelocityProperties properties;

        protected void applyProperties(VelocityEngineFactory factory) {
            factory.setResourceLoaderPath(this.properties.getResourceLoaderPath());
            factory.setPreferFileSystemAccess(this.properties.isPreferFileSystemAccess());
            Properties velocityProperties = new Properties();
            velocityProperties.putAll(this.properties.getProperties());
            velocityProperties.setProperty("input.encoding", this.properties.getCharset());
            factory.setVelocityProperties(velocityProperties);
        }

    }

    @Configuration
    @ConditionalOnNotWebApplication
    public static class VelocityNonWebConfiguration extends VelocityConfiguration {

        @Bean
        @ConditionalOnMissingBean
        public VelocityEngineFactoryBean velocityConfiguration() {
            VelocityEngineFactoryBean velocityEngineFactoryBean = new VelocityEngineFactoryBean();
            applyProperties(velocityEngineFactoryBean);
            return velocityEngineFactoryBean;
        }

    }

    @Configuration
    @ConditionalOnClass(Servlet.class)
    @ConditionalOnWebApplication
    public static class VelocityWebConfiguration extends VelocityConfiguration {

        @Bean
        @ConditionalOnMissingBean(VelocityConfig.class)
        public VelocityConfigurer velocityConfigurer() {
            VelocityConfigurer configurer = new VelocityConfigurer();
            applyProperties(configurer);
            return configurer;
        }

        @Bean
        public VelocityEngine velocityEngine(VelocityConfigurer configurer)
                throws VelocityException, IOException {
            return configurer.getVelocityEngine();
        }

        @Bean
        @ConditionalOnMissingBean(name = "velocityViewResolver")
        @ConditionalOnProperty(name = "spring.velocity.enabled", matchIfMissing = true)
        public VelocityViewResolver velocityViewResolver() {
            EmbeddedVelocityViewResolver resolver = new EmbeddedVelocityViewResolver();
            this.properties.applyToViewResolver(resolver);
            return resolver;
        }

    }

}





© 著作权归作者所有

活的自由
粉丝 65
博文 80
码字总数 12547
作品 0
成都
高级程序员
私信 提问
加载中

评论(5)

活的自由
活的自由 博主

引用来自“587”的评论

其实不用这么麻烦的
spring.velocity.charset=UTF-8
spring.velocity.properties.input.encoding=UTF-8
spring.velocity.properties.output.encoding=UTF-8
解决问题

谢谢,这就是我想要的
似故人来
似故人来
其实不用这么麻烦的
spring.velocity.charset=UTF-8
spring.velocity.properties.input.encoding=UTF-8
spring.velocity.properties.output.encoding=UTF-8
解决问题
wellyao
wellyao

引用来自“耀哥”的评论

代码有误 是 velocityProperties.put("input.encoding", this.properties.getCharset());

velocityProperties.setProperty("input.encoding", this.properties.getCharset().name());
wellyao
wellyao
代码有误 是 velocityProperties.put("input.encoding", this.properties.getCharset());

p2ng
p2ng
spring.velocity.outputencoding
inputencoding
两个都是utf8就好。
手机码字,明天补全
Spring集成Velocity的中文解决方案

在Spring 框架中使用Velocity是非常方便的,只需在spring配置文件中申明: 即可在spring mvc框架中直接返回new ModelAndView("velocity模板", map),但是中文一直为乱码。 为了解决中文问题,...

小编辑
2010/01/05
2.4K
1
Spring MVC整合Velocity

Velocity模板(VM)语言介绍 Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于...

张辉原
2017/06/15
0
0
spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500

问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json数据报错:no convertter for retur...

陈守印
2018/06/15
248
0
velocity00-springmvc下使用velocitv的乱码解决

今天首次使用velocity+springmvc组合,写了个测试例子,出现了乱码问题,最终通过spring下使用velocity的中文乱码问题找到答案。 具体解决添加如下: 1.添加contentType为UTF-8 <bean id="d...

wayne很忙
2012/12/08
367
0
spring boot + thymeleaf 乱码问题

spring boot + thymeleaf ,现在一个简单的html页面都有乱码问题,(不是所有中文都是乱码,而是部分乱码) 配置如下: spring: thymeleaf: prefix: classpath:/templates/ suffix: .html m...

hellotrms
2017/01/17
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
30分钟前
6
0
IDEA 自定义方法注解模板

IDEA 自定义方法注解模板 1、使用效果 /*** 计算交易费用* @Author wangjiafang* @Date 2019/9/11* @param feeComputeVo* @return*/@PostMapping("/v1/fee_compute")public ApiResp......

小白的成长
30分钟前
6
0
转:进程 线程 协程 管程 纤程 概念对比理解

引言 不知道是不是我自己本身就有那么一丝丝的密集恐惧,把这么一大堆看起来很相似很相关的概念放在一起,看起来是有点麻,捋一捋感觉舒服多了。 相关概念 任务、作业(Job,Task,Schedule)...

xiaomin0322
41分钟前
6
0
前端数组转化成字符串

val=val.join(","); 转化后:“1,2,3”

郭周园
43分钟前
4
0
Spring Boot Admin配置详解

Client端配置 参数 默认值 说明 spring.boot.admin.client.enabled true 是否启用springbootAdmin客户端 spring.boot.admin.client.url 要注册的server端的url地址。如果要同时在多个server端...

兜兜毛毛
43分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部