springboot 调整validate的提示信息默认语言

阅读:369
作者:majingjing
发布:2020-02-07 12:58:56

当我们在springboot中集成validate框架后, 使得我们的程序参数验证变得非常简单.

需求分析

比如实现参数验证非空

框架默认返回的是 Chinese, 此时我们可以通过改变 Accept-Language 的值来完成多语言的message切换

  • 但是有时我们也希望默认返回English描述,此时再采用框架的默认配置就很难实现,需要调整配置

我们可以通过改变语言时区来完成框架消息的渲染. 下面我们就来翻翻框架代码, 做下调整,完成我们的需求

源代码跟踪

  1. 我们都知道spring-mvc的入口程序在 org.springframework.web.servlet.DispatcherServlet#doDispatch , 而多语言的转换在程序解析完成后做视图渲染的时候才执行的
  2. org.springframework.web.servlet.DispatcherServlet#processDispatchResult,这个方法里面完成了视图的render操作
if (mv != null && !mv.wasCleared()) {
	render(mv, request, response);
	if (errorView) {
		WebUtils.clearErrorRequestAttributes(request);
	}
}
  1. 再次翻看 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. 再深入查找对应的实现类

  1. 到此其实我们已经找到了修改的方法,编写代码
@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 即可