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

原创
2015/09/21 20:57
阅读数 2.2K

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;
        }

    }

}





展开阅读全文
打赏
0
6 收藏
分享
加载中
活的自由博主

引用来自“587”的评论

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

谢谢,这就是我想要的
2015/09/29 18:37
回复
举报
其实不用这么麻烦的
spring.velocity.charset=UTF-8
spring.velocity.properties.input.encoding=UTF-8
spring.velocity.properties.output.encoding=UTF-8
解决问题
2015/09/29 17:43
回复
举报

引用来自“耀哥”的评论

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

velocityProperties.setProperty("input.encoding", this.properties.getCharset().name());
2015/09/22 10:28
回复
举报
代码有误 是 velocityProperties.put("input.encoding", this.properties.getCharset());

2015/09/22 10:25
回复
举报
spring.velocity.outputencoding
inputencoding
两个都是utf8就好。
手机码字,明天补全
2015/09/22 00:32
回复
举报
更多评论
打赏
5 评论
6 收藏
0
分享
返回顶部
顶部