IDEA中使用maven 创建 的ssm项目使用sprimg mvc国际化功能报错No message found under code ‘welcome‘ for locale ‘en_US'

最近在学习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 标签中指定,不然就会出现编译没有问题,运行时出现找不到文件的情况.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值