对于我们自定义的校验注解,JSR-303默认从类路径下的ValidationMessages.properties
里读取默认的message。在Spring Boot项目中,我们可能想修改message文件的位置,或加载多个message文件,这时可以通过自定义配置Validator
的方式来实现。
SpringBoot对Validation的自动配置
SpringBoot对数据校验的自动配置在org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration
下,其配置了一个默认的Validator
:
@AutoConfiguration
//@...
public class ValidationAutoConfiguration {
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
@ConditionalOnMissingBean(Validator.class)
public static LocalValidatorFactoryBean defaultValidator(ApplicationContext applicationContext) {
LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory(applicationContext);
factoryBean.setMessageInterpolator(interpolatorFactory.getObject());
return factoryBean;
}
//...
}
在上述配置中,SpringBoot为Validator
设置了一个默认的MessageInterpolator
,其默认情况下会保持JSR-303原本的message读取行为,即从类路径下的ValidationMessages.properties
里读取message。我们要做的就是手动注入Validator
,设置自己的MessageInterpolator
,使其能够加载自定义的message文件。
自定义message文件位置
在项目中新建一个配置类ValidationConfig.java
,并注入一个Validator
Bean,配置message文件为类路径下MyMessages.properties
:
@Configuration
public class ValidationConfig {
@Bean
public static LocalValidatorFactoryBean validator(ApplicationContext applicationContext) {
LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory(applicationContext);
factoryBean.setMessageInterpolator(new ResourceBundleMessageInterpolator(
//配置message文件为MyMessages.properties
new PlatformResourceBundleLocator("MyMessages") //不用带.properties后缀
)
);
return factoryBean;
}
}
自定义多个message文件
除了能使用PlatformResourceBundleLocator
来读取一个message文件,我们还可以使用AggregateResourceBundleLocator
来读取多个message文件。以下配置使Validator
能够读取类路径下的ValidationMessages.properties
和common/ValidationMessages.properties
作为message文件:
@Configuration
public class ValidationConfig {
@Bean
public static LocalValidatorFactoryBean validator(ApplicationContext applicationContext) {
LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory(applicationContext);
factoryBean.setMessageInterpolator(new ResourceBundleMessageInterpolator(
//使用AggregateResourceBundleLocator读取多个message文件
new AggregateResourceBundleLocator(
Arrays.asList(
"ValidationMessages",
"common.ValidationMessages"
)
)
)
);
return factoryBean;
}
}