属性文件中的Spring和字符编码

时间:2014-11-11 09:46:01

标签: spring character-encoding thymeleaf

我知道,关于属性文件中的编码有很多问题,但我找不到能帮到我的答案,所以我再问一次。

所以我有一个基于Spring 4的项目,使用Java Config和Thymeleaf作为模板引擎。 我想在属性文件中指定一些标签,并使用Thymeleaf的指令#{property.name}读取.html文件中的属性值。

我已经在字符编码过滤器中设置了enconding,我还在messageSource中设置了编码(我使用的是ReloadableResourceBundleMessageSource)。我还在pom.xml中添加了属性:         UTF-8

老实说,我不知道我能做错什么。 我没有从stackoverflow回答中找到的东西做的事情:

我没有配置ant / maven native2ascii插件,因为我试图将我的角色(如ó或ł)更改为ascii对应物,几乎所有角色仍然被'??'取代迹象。

我还没有配置maven-resource-plugin,因为我不确定如果所有.properties文件都可用,我为什么要使用它呢?

修改

MessageSource定义:

@Bean(name = "messageSource")
public ReloadableResourceBundleMessageSource getMessageSource() {
    ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
    resource.setBasenames("/i18n/messages");
    resource.setDefaultEncoding("UTF-8");
    return resource;
}

WebApp初始化:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    WebApplicationContext context = getContext();
    servletContext.addListener(new ContextLoaderListener(context));
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
    FilterRegistration.Dynamic fr = servletContext.addFilter("encodingFilter",
            new CharacterEncodingFilter());
    fr.setInitParameter("encoding", "UTF-8");
    fr.setInitParameter("forceEncoding", "true");
    fr.addMappingForUrlPatterns(null, true, "/*");
}

Maven属性定义              UTF-8         (其他物业)     

HTML文件中的引用(锚标记中):

th:href="@{about.html}" th:text="#{navigation.about}" 

属性文件是:webapp / i18n / message_en_EN.properties,webapp / i18n / message_pl_PL.properties(两者都由Intellij以UTF-8编码保存)

1 个答案:

答案 0 :(得分:1)

好的,问题就在于Thymeleaf。

我使用的是ServletContextTemplateResolver和ThymeleafViewResolvere,我不得不在这两个对象中设置编码:

@Bean(name="templateResolver")
public ServletContextTemplateResolver getServletContextTemplateResolver() {
    ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
    templateResolver.setPrefix("/somepath/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML5");
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setCacheable(false);
    return templateResolver;
}

@Bean(name="viewResolver")
public ThymeleafViewResolver getThymeleafViewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(getTemplateEngine());
    viewResolver.setOrder(1);
    viewResolver.setCharacterEncoding("UTF-8");
    return viewResolver;
}