框架:springboot 2.3.3
项目交付以后本来后端响应的消息统一响应的是code没有附带消息,消息前端通过code进行匹配多种语言,然后前端三哥突然打算让我直接返回对应的语言信息,好吧,只能临时更改了
恰巧前一天琢磨了一下@RestControllerAdvice的用法,今天恰巧排上了用场,在求助了万能的群友后知道了i18n这个包,记录一下,省的以后再用到处找
依赖配置类org.webjars.bower jquery-i18n-properties 1.2.7
有了依赖以后我们创建一个配置类,具体功能在里面解释
@Configuration
public class LocaleConfig {
@Bean
public SessionLocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
// 这里配置了在没有指定语言的默认情况下匹配的语言种类,你也可以追进去看看每个语言的tag是什么
// tag就是你语言的代号,下面lang值对应的参数,这是一个全局变量。
localeResolver.setDefaultLocale(Locale.ENGLISH);
return localeResolver;
}
@Bean
public WebMvcConfigurer localeInterceptor() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
// 这里指定一个从前端form-data或者url参数获取语言tag的key值,比如这里是lang
// 前端就需要传参?lang=zh_CN。zh是语言tag,对应全局变量中的语言,CN是国家代号,这里似乎没用上最好还是设置上吧
localeInterceptor.setParamName("lang");
registry.addInterceptor(localeInterceptor);
}
};
}
}
配置语言包
yml配置文件添加内容
spring:
messages:
#指定了语言包所在位置
basename: language.message
cache-duration: 3600
encoding: UTF-8
首先创建一个首要语言包message.properties,不需要什么内容,可以为空,后续我们通过拓展包对语种进行归类
然后我们分别创建其他语言的语言包,注意格式message****
语言包内容[同一个语义对应的同一个key]
@GetMapping("/info")
public Result getInfo(){
User user = new User();
return new Result<>(true,CodeEnum.SUCCESS.getCode(),
messageSource.getMessage(
"success", // 这里是语言包中properties对应的key值
null,// 占位参数,一般不设置
LocaleContextHolder.getLocale() // 区域选择,这里选择了当前语言环境,也就是根据前端参数设置的语言
),user);
}
解决当前问题
当前情况是我已经全部统一通过Result返回了,并且只返回了code并没有msg,我现在在Result里新增一个成员属性msg
现在我们返回的结果就是
{
flag:true
code:20
msg:null
data:object
}
我们创建一个接口层增强器@RestControllerAdvice统一处理响应[也可以在拦截器中处理]
@RestControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice
前端请求以及响应
注意这里的param必须和你的配置文件后缀一致
如果不想统一响应可以去除最后的那段,如果加了那个:当匹配不上的时候就包装起来响应,那我们不处理的话就只是检测到是Result就取出code并匹配填入



