用@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>
之前学的可以很简单获取到国际化资源信息,只要切换浏览器语言即可
但是注解加了@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>
这里只提供解决思路,有问题的话欢迎私信或者评论
参考资料:https://www.bilibili.com/video/av56193747?p=300