对于国际性应用来说,提示信息的双语化是必须的,那么@Validated 和 @Valid校验提示信息怎么来进行双语化呢,下面我们一起学习一下。
@Validated 和 @Valid校验提示信息的双语化
SpringBoot项目双语化配置
因为这里是基于SpringBoot项目学习的,所以我们首先需要配置一下SpringBoot项目的双语化,具体步骤如下:
设置配置文件
# 设置国际化消息是否总是采用格式化,默认是false
spring.messages.always-use-message-format=true
# 设置国际化属性名称,如果多个可以使用逗号分隔,默认是messages
spring.messages.basename=param-valid-messages
# 设置国际化消息缓存超时秒数,默认永远不过期,如果是0表示每次都需要重新加载
spring.messages.cache-duration=0# 国际化消息编码
spring.messages.encoding=UTF-8
# 如果没有找到特定区域设置的文件,则设置是否返回系统区域设置
spring.messages.fallback-to-system-locale=true
# 是否使用消息编码作为默认的响应消息,而非抛出NoSuchMessageException异常,只建议再开发阶段使用
spring.messages.use-code-as-default-message=false
创建国际化消息资源文件
添加国际化消息配置类
@Configuration
public class MessageConfig implements WebMvcConfigurer {/*** 国际化拦截器*/private LocaleChangeInterceptor localeChangeInterceptor;/*** 初始化国际化解析器* 注意:这里的bean的名称必须是“localeResolver”,这是和SpringMVC的约定* @return 基于session的国际化解析器*/@Bean(name = "localeResolver")public LocaleResolver initLocaleResolver(){SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();// 设置默认的国际化区域是中国(简体中文)sessionLocaleResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);return sessionLocaleResolver;}/*** 创建国际化拦截器* @return 国际化拦截器*/@Beanpublic LocaleChangeInterceptor localeChangeInterceptor(){if(localeChangeInterceptor != null){return localeChangeInterceptor;}localeChangeInterceptor = new LocaleChangeInterceptor();// 设置参数名,这样就可以根据请求的"param-valid-language"参数值来判断当前的语言环境localeChangeInterceptor.setParamName("param-valid-language");return localeChangeInterceptor;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(localeChangeInterceptor());}
}
封装消息获取工具类
@Component
public class MessageHandler {@Autowiredprivate MessageSource messageSource;public String getMessage(String messageKey){Locale locale = LocaleContextHolder.getLocale();return messageSource.getMessage(messageKey, null, locale);}public String getMessage(String messageKey, Object...params){Locale locale = LocaleContextHolder.getLocale();return messageSource.getMessage(messageKey, params, locale);}
}
测试
经过上述步骤,就设置好了国际化消息的基本配置,下面创建一些国际化消息以及测试接口来测试一下:
@Autowiredprivate MessageHandler messageHandler;@GetMapping("/messageTest")public ResultVO messageTest(){return new ResultVO().setCode(ResultVO.VALID_PASS).setMsg(messageHandler.getMessage("message.test"));}
测试结果如下:
@Validated 和 @Valid校验提示信息的双语化
有了上面的基础,我们再来一起设置下@Validated 和 @Valid校验提示信息的双语化
给mvc的validator设置双语化
@Configuration
public class MessageConfig implements WebMvcConfigurer {@Autowiredprivate MessageSource messageSource;/*** valid校验机制提示信息国际化设置*/@Beanpublic LocalValidatorFactoryBean validatorFactoryBean(){LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();localValidatorFactoryBean.setValidationMessageSource(messageSource);return localValidatorFactoryBean;}@Overridepublic Validator getValidator() {return validatorFactoryBean();}
}
条件校验注解的message使用占位符
@Data
public class UserDTO {@NotNull(message = "{notNull}")private Object notNull;@Length(min = 1, max = 10, message = "{length}")private String length;@Min(value = 1, message = "{min}")private Integer min;
}
准备双语文件
测试
好了,今天就先到这里了,拜拜。