Spring Boot 中的国际化与 thymeleaf

问题描述 投票:0回答:1

我想用 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**
spring spring-boot thymeleaf spring-thymeleaf
1个回答
0
投票
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/spi/resourceloading/ResourceBundleLocator
Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.spi.resourceloading.ResourceBundleLocator

这应该意味着 Java 虚拟机 (JVM) 无法找到

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
© www.soinside.com 2019 - 2024. All rights reserved.