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 chapter16msg_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>总结:在使用maven进行项目的资源管理时需要注意它打包时的文件过滤问题,如果我们的部分核心配置文件不在默认包含范围内,那么就需要在build 标签中指定,不然就会出现编译没有问题,运行时出现找不到文件的情况.