最近在学习spring mvc框架的国际化功能时遇到了一个问题,配置了相关属性文件检查文件名规范后,maven编译打包,启动tomcat 访问却报错 No message found under code 'welcome' for locale 'en_US'.
以下是部分报错信息:
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: No message found under code 'welcome' for locale 'en_US'.
Exception
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: No message found under code 'welcome' for locale 'en_US'.
Root Cause
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: No message found under code 'welcome' for locale 'en_US'.
....
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause
javax.servlet.jsp.JspTagException: No message found under code 'welcome' for locale 'en_US'.
...
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
配置文件部分:
首先是国际化资源加载类的实例配置:(这里使用的是jdk自带的类路径加载器,国际化资源文件只能放在class路径下.maven项目中存放在resources目录下)
@Configuration
public class LocaleConfig {
/**
* 不能热加载,文件只能存放在classpath下
* @return
*/
@Bean(name="messageSource")
public MessageSource initMessageSource(){
ResourceBundleMessageSource msgSrc = new ResourceBundleMessageSource();
msgSrc.setDefaultEncoding("UTF-8");
// 设置国际化文件的前缀,后缀会根据 Locale 来确定
msgSrc.setBasename("msg");
return msgSrc;
}
// @Bean(name = "messageSource")
// public MessageSource initMessageSource(){
// ReloadableResourceBundleMessageSource msgSrc = new ReloadableResourceBundleMessageSource();
// msgSrc.setDefaultEncoding("UTF-8");
// msgSrc.setBasename("classpath:msg");
// msgSrc.setCacheSeconds(3600);
// return msgSrc;
// }
}
国际化实现方式配置文件:(此处使用的是cookie方式)
@Configuration
public class LocaleResolverConfig {
/**
* cookie 国际化实例配置 不够灵活安全,一般使用的较多的是SessionLocaleResolver
* @return 国际化实例
*/
@Bean(name = "localeResolver")
public LocaleResolver initCookieLocaleResolver(){
CookieLocaleResolver clr = new CookieLocaleResolver();
clr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
clr.setCookieName("lang");
clr.setCookieMaxAge(1800);
return clr;
}
}
此外在resources目录下还有两个国际化文件msg_en_US.properties,msg_zh_CN.properties, 内容如下:
msg_en_US.properties
welcome=the project name is chapter16
msg_zh_CN.properties
welcome=工程的名称为:chapter16
错误排查过程:
错误出现后第一时间是上网查询有没有前辈出现类似的错误的,在看了几篇博客后都说有可能是文件名称错误或不存在导致的.我反复在idea中看了一下文件确实存在,而且也没错.这时我想到了去maven编译输出目录查找看看,点开maven生成的target目录进到子目录classes 一看,在resources目录下的所有名为properties文件都没有打包进去,这样就找到了问题点.既然确定是maven打包的问题,这就好办了,修改pom文件将.properties文件全部包含进去.
在resources标签下添加以下代码,这样maven打包时就会将以properties结尾的文件也包含进去了:
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
最后,修改了pom文件后记得执行maven clean 清除原有内容防止缓存干扰,再执行maven install,重启tomcat后问题解决.
总结:在使用maven进行项目的资源管理时需要注意它打包时的文件过滤问题,如果我们的部分核心配置文件不在默认包含范围内,那么就需要在build 标签中指定,不然就会出现编译没有问题,运行时出现找不到文件的情况.