说明
springMvc配置国际化拦截器失败,点击页面按钮切换中英文无效,排查发现没有进入
LocaleChangeInterceptor 类中,判断拦截器没有起作用,那么是什么原因导致拦截器无效,通过查看官网配置及查找其他码友分析,
判断应该是annotation-driven 和 interceptors配置问题,调整两者顺序,果然解决问题,如下
<!-- if you use annotation you must configure following setting, 2.这块还能调整自定义跳转正常 3.配置自定义转换器 4. 配置validator--> <mvc:annotation-driven conversion-service="conversionService" validator="validator" /> <!--该拦截器通过名为”lang”的参数来拦截HTTP请求,使其重新设置页面的区域化信息, #####特别提醒,interceptors必须在annotation-driven之后 ######--> <mvc:interceptors> <!-- 该拦截器通过名为”locale”的参数来拦截HTTP请求,使其重新设置页面的区域化信息 【拦截所有请求】--> <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> </bean> </mvc:interceptors>
- springMvc 版本
4.3.12.RELEASE
- springMvc 所用jar(参照别的码友的整理)
IOC
core:资源访问,类型转换
beans:bean工厂
expression:${}获取属性
context:核心接口ApplicationContext
AOP
aop:面向切面编程的实现
aspects:对AspectJ的整合
DAO
jdbc:通过jdbc模板类访问数据库
tx:事务的实现
orm:与hibernate,mybatis的集成
oxm:对象与xml数据之间的相互转换
jms:系统之间发送消息,异步通信
Web
web:与web项目的整合
webmvc:子模块springMVC
Test test:测试
3. 相关配置文件及依赖
pom文件(除了上面的基础依赖之外的依赖jar包)
<!--springMvc DispatcherServlet depend on --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!-- utils --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.5</version> </dependency> <!-- 日志 logback --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>0.9.28</version> <type>jar</type> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>0.9.28</version> <type>jar</type> </dependency> <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>compile</scope> </dependency> <!--jsp依赖包--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> <!--springMvc validation --> <!-- https://mvnrepository.com/artifact/javax.validation/validation-api --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.FINAL</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> </dependency> <!-- =================== BEGIN OF 后端传递集合数据到前端 =================== --> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.11.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.11.2</version> </dependency> <!-- END OF 后端传递集合数据到前端 -->
spring.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> <!-- 国际化资源文件 messageSource配置的是国际化资源文件的路径, classpath:messages指的是classpath路径下的 messages_zh_CN.properties文件和messages_en_US.properties文件 设置“useCodeAsDefaultMessage”,默认为false ,这样当Spring在ResourceBundle中找不到messageKey的话,就抛出NoSuchMessageException, 把它设置为True,则找不到不会抛出异常,而是使用messageKey作为返回值。 ResourceBundleMessageSource 改为 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="defaultEncoding" value="UTF-8" /> <property name="useCodeAsDefaultMessage" value="true" /> <property name="basename" value="classpath:message/i18n" /> </bean> <!-- 存储区域设置信息 SessionLocaleResolver类通过一个预定义会话名将区域化信息存储在会话中 从session判断用户语言defaultLocale :默认语言 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <!-- 设置session attribute的key --> <property name="localeAttributeName" value="locale"/> <!-- 设置默认的Locale --> <property name="defaultLocale" value="zh_CN" /> </bean> </beans>
spring-mvc.mxl
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 允许对静态资源文件的访问 --> <mvc:default-servlet-handler /> <!-- 扫描控制器类 --> <context:component-scan base-package="com.daisy" /> <!-- if you use annotation you must configure following setting, 2.这块还能调整自定义跳转正常 3.配置自定义转换器 4. 配置validator--> <mvc:annotation-driven conversion-service="conversionService" validator="validator" /> <!--该拦截器通过名为”lang”的参数来拦截HTTP请求,使其重新设置页面的区域化信息, #####特别提醒,interceptors必须在annotation-driven之后 ######--> <mvc:interceptors> <!-- 该拦截器通过名为”locale”的参数来拦截HTTP请求,使其重新设置页面的区域化信息 【拦截所有请求】--> <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> </bean> </mvc:interceptors> <!--ConversionServiceFactoryBean:只能转换数据,FormattingConversionServiceFactoryBean:既能转换数据也能对数据进行格式化--> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set><!--tip Class Name first Charactor Lowercase--> <ref bean="myEmployeeConvert"/> </set> </property> </bean> <!--validation 验证数据是否合法 --> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <!--不设置则默认为classpath下的 ValidationMessages.properties --> <property name="validationMessageSource" ref="messageSource"/> </bean> <!-- 定义跳转的文件的前后缀 --> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="viewResolvers"> <list> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </list> </property> <!--配置处理返回数据集合--> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/> </list> </property> </bean> </beans>