欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用@ResponseBoby返回json数据的时候国际化资源文件失效的解决办法

程序员文章站 2022-07-12 19:41:12
...

一、问题提出

相信很多小伙伴会遇到这样的问题,在学习springMVC阶段我们会接触后端国际化和AJAX,两个分开用的时候没有任何问题,但是一旦用 @ResponseBoby 返回 json 数据的时候springmvc后端配置的国际化资源文件就失效了

示例:

<!-- 让springMVC管理国际化资源文件 -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="conf.view"/>
        <property name="useCodeAsDefaultMessage" value="true"/>
    </bean>
    @RequestMapping("/empss")
    public String getEmps(@RequestParam(value = "pn", defaultValue = "1") Integer pn) {
        //分页查询,要查的对象紧跟pageHelper,每次显示5行
        PageHelper.startPage(pn, 5);
        List<Employee> emps = employeeService.getAll();
        //包装分页结果,每次显示五页
        PageInfo<Employee> pageInfo = new PageInfo<>(emps, 5);
        return "WEB-INF/pages/list.jsp";
    }
<!--导入fmt标签库-->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
......
//调用标签库方法
<h1><fmt:message key="welcomeinfo"/></h1>

之前学的可以很简单获取到国际化资源信息,只要切换浏览器语言即可
用@ResponseBoby返回json数据的时候国际化资源文件失效的解决办法
用@ResponseBoby返回json数据的时候国际化资源文件失效的解决办法
用@ResponseBoby返回json数据的时候国际化资源文件失效的解决办法
但是注解加了@ResponseBody后端的区域化信息就失效了,返回的是一串JSON数据:WEB-INF/pages/list.jsp

二、失效原因:

原因其实很简单,@ResponseBody 是直接把方法返回值里的数据转换成JSON数据,然后传给浏览器,所以后端的页面渲染也就不走了,前端也直接通过发AJAX请求进行数据传输。既然后端没用了,SpringMVC配置文件不管你怎么改都没用,所以别白费时间配置后端了!

三、解决方法:

解决方法有很多种,可以用 JSON 形式的国际化资源文件等等,不过把.prop改成.js实在不美观,这里我说一下我的解决思路:
  也是在前端管理国际化资源文件,但是也使用fmt标签库,点击链接切换语言而不是通过浏览器自带的语言切换方式,将区域信息通过请求参数的形式传递,效果如下:

	@ResponseBody
    @RequestMapping("/emps")
    public Msg getEmpsWithJson(@RequestParam(value = "pn", defaultValue = "1") Integer pn) {
        //分页查询,要查的对象紧跟pageHelper,每次显示5行
        PageHelper.startPage(pn, 5);
        List<Employee> emps = employeeService.getAll();
        //包装分页结果,每次显示五页
        PageInfo<Employee> pageInfo = new PageInfo<>(emps, 5);
        return Msg.success().add("pageInfo", pageInfo);
    }
<!--这段代码写在哪里都行,不过要写在fmt:message前,最好写在body里第一行-->
<fmt:setLocale value="${param.loc}"/> <!--这段代码是从请求参数中获取国际化信息-->
<fmt:setBundle basename="conf.view"/> <!--这段代码获取项目中的国际化资源文件-->
......
<a href="index.jsp?loc=zh_CN">中文</a>|<a href="index.jsp?loc=en_US">English</a>
<h1><fmt:message key="welcomeinfo"/></h1>

用@ResponseBoby返回json数据的时候国际化资源文件失效的解决办法
用@ResponseBoby返回json数据的时候国际化资源文件失效的解决办法
这里只提供解决思路,有问题的话欢迎私信或者评论
参考资料:https://www.bilibili.com/video/av56193747?p=300