我想用 thymeleaf 在 Spring Boot 中设置国际化。 我创建了这个类:
@Configuration
public class MvcConfig implements WebMvcConfigurer {
private final MessageSource messageSource;
public MvcConfig(MessageSource messageSource) {
this.messageSource = messageSource;
}
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.ENGLISH);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Bean
public LocalValidatorFactoryBean getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource);
return bean;
}
}
但是当我启动项目时出现此错误:
**Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2024-04-04 18:09:14.060 ERROR [] o.s.boot.SpringApplication@reportFailure(851) - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getValidator' defined in class path resource [com/mysticriver/config/MvcConfig.class]: Failed to instantiate [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean]: Factory method 'getValidator' threw exception with message: org/hibernate/validator/spi/resourceloading/ResourceBundleLocator
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:648)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1335)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1165)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:962)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:334)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343)
at com.mysticriver.ServingWebContentApplication.main(ServingWebContentApplication.java:13)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean]: Factory method 'getValidator' threw exception with message: org/hibernate/validator/spi/resourceloading/ResourceBundleLocator
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:177)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644)
... 22 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/spi/resourceloading/ResourceBundleLocator
at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.setValidationMessageSource(LocalValidatorFactoryBean.java:168)
at com.mysticriver.config.MvcConfig.getValidator(MvcConfig.java:48)
at com.mysticriver.config.MvcConfig$$SpringCGLIB$$0.CGLIB$getValidator$2(<generated>)
at com.mysticriver.config.MvcConfig$$SpringCGLIB$$FastClass$$1.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
at com.mysticriver.config.MvcConfig$$SpringCGLIB$$0.getValidator(<generated>)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140)
... 23 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.spi.resourceloading.ResourceBundleLocator
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 33 common frames omitted**
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/spi/resourceloading/ResourceBundleLocator
Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.spi.resourceloading.ResourceBundleLocator
ResourceBundleLocator
类,它是 Hibernate Validator 库的一部分。
Spring Boot 提供了一个父 POM(项目对象模型),它带有依赖管理部分,为许多依赖项指定默认版本,包括
hibernate-validator
,确保兼容性并减轻指定和管理标准版本的负担。
如果您
pom.xml
继承自 Spring Boot Starter 父级,并且在您的项目中使用 Spring Boot Starter Parent 或 spring-boot-dependencies
作为 BOM(物料清单),则可以依靠 Spring Boot 的依赖管理来选择合适的版本。 pom.xml
。只需包含依赖项而不指定版本:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
然后,您将使用经过测试并推荐用于您的 Spring Boot 版本的
hibernate-validator
版本。
您还可以使用 Maven
dependency:tree
命令查看该版本,或检查 spring-boot-dependencies
POM 以获得您的 Spring Boot 版本。
mvn dependency:tree -Dincludes=org.hibernate.validator