当我们在springboot中集成validate框架后, 使得我们的程序参数验证变得非常简单.
需求分析
比如实现参数验证非空
框架默认返回的是 Chinese
, 此时我们可以通过改变 Accept-Language
的值来完成多语言的message切换
-
但是有时我们也希望默认返回
English
描述,此时再采用框架的默认配置就很难实现,需要调整配置
我们可以通过改变语言时区来完成框架消息的渲染. 下面我们就来翻翻框架代码, 做下调整,完成我们的需求
源代码跟踪
- 我们都知道spring-mvc的入口程序在
org.springframework.web.servlet.DispatcherServlet#doDispatch
, 而多语言的转换在程序解析完成后做视图渲染的时候才执行的 - 即
org.springframework.web.servlet.DispatcherServlet#processDispatchResult
,这个方法里面完成了视图的render
操作
if (mv != null && !mv.wasCleared()) {
render(mv, request, response);
if (errorView) {
WebUtils.clearErrorRequestAttributes(request);
}
}
- 再次翻看
org.springframework.web.servlet.DispatcherServlet#render
// Determine locale for request and apply it to the response.
Locale locale =
(this.localeResolver != null ? this.localeResolver.resolveLocale(request) : request.getLocale());
response.setLocale(locale);
在这里我们看到了org.springframework.web.servlet.LocaleResolver
的操作类
4. 再深入查找对应的实现类
- 到此其实我们已经找到了修改的方法,编写代码
@Configuration
public class MyEnglishLocaleResolver {
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(Locale.ENGLISH);
return localeResolver;
}
}
上述代码就实现了默认配置为 ENGLISH
的方案.
测试
当我们在填写 Accept-Language
时会返回对应语言的message, 但是当我们不填写时就会默认返回 ENGLISH
的message
总结
上述完成了默认语言的替换, 有时后我们是希望动态的替换语言的场景,该如何操作呢 ?
其实也是非常容易的, 我们只需要重写 对应的 LocaleResolver
即可