1. 程式人生 > >Spring 的MVC I18N-國際化相關配置出現的問題

Spring 的MVC I18N-國際化相關配置出現的問題

今天用spring的mvc做國際化配置,出現了這樣的錯誤

“Cannot change HTTP accept header - use a different locale resolution strategy”。

在網上找了一些資料,根本原因是spring source 做了限制,原始碼如下

public class AcceptHeaderLocaleResolver implements LocaleResolver {

 public Locale resolveLocale(HttpServletRequest request) {
  return request.getLocale();
 }

 public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
  throw new UnsupportedOperationException(
    "Cannot change HTTP accept header - use a different locale resolution strategy");
 }
 
}

請注意上面的類,該類允許繼承,所以需要改寫setLocale方法,原始碼示範如下

  • localeResolver要用CookieLocaleResolver而不是AcceptHeaderLocaleResolver,若是後者則會丟擲異常:
    throw new UnsupportedOperationException(”Cannot change HTTP accept header - use a different locale resolution strategy”);
  • message.properties是不能被作為預設或是英文識別的,資原始檔必須加上_en或_zh之類的字尾,如message_en.properties和message_zh.properties

你可以使用LocaleChangeInterceptor修改本地化資訊。這個攔截器需要被新增到處理器對映中它可以偵測請求中某個特定的引數,然後呼叫上下文中的LocaleResolver中的 setLocale()方法,相應地修改本地化資訊。

package joddform;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;

public class MyAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver{

 Locale myLocale;

 @Override
 public Locale resolveLocale(HttpServletRequest request) {
  return myLocale;
 }

 @Override
 public void setLocale(HttpServletRequest request,
   HttpServletResponse response, Locale locale) {
  myLocale = locale;
 }

}

<bean id="messageSource"
  class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basenames">
   <list>
    <value>classpath*:i18n/error</value>
    <value>classpath*:i18n/message</value>
   </list>
  </property>
 </bean>

 <bean id="joddformhandlerMapping"
  class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <value>joddform.do=joddformController</value>
  </property>
  <property name="interceptors">
   <list>
    <ref bean="joddformInterceptor" />
    <ref bean="localeChangeInterceptor" />
   </list>
  </property>
 </bean>
 <bean id="joddformController" class="joddform.JoddformController">
 </bean>
 <bean id="joddformInterceptor"
  class="joddform.JoddformInterceptor">
 </bean>
 <bean id="localeChangeInterceptor"
  class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
  <property name="paramName" value="setLanguage" />
 </bean>
 
 <!--
 兩種都可以,如果不改變預設的LocaleResolver的方法,就直接用CookieLocaleResolver
 千萬記得這裡bean的id一定是localeResolver,不然會找不到的
 更重要的一點是屬性檔案要帶上_en,如在i18n包中如果寫message.properties,它找不到英文檔案
 所以,不管setLanguage如何設定都只能找到中文的屬性檔案
  -->

 <!--  
  <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
 -->
 <bean id="localeResolver" class="joddform.MyAcceptHeaderLocaleResolver"></bean>

相關推薦

SpringMVC I18N國際化相關配置出現的問題

今天用spring的mvc做國際化配置,出現了這樣的錯誤 “Cannot change HTTP accept header - use a different locale resolution strategy”。 在網上找了一些資料,根本原因是spring sour

Spring mvc i18n國際化的簡單demo

在渲染檢視的xml檔案中,配置一個i18nBean    @Controller package com.oukele.web; import org.springframework.beans.factory.annotation.Autowired; import org

如何實現 Spring MVC i18n 國際化,動態設定預設語言

1.在spring配置檔案中配置資原始檔properties的位置及公共名,下列配置指定的properties檔案處於src目錄下的 resources資料夾中,名字為message_info_*.properties。 <bean id="messageSo

Spring MVC 基於session 國際化配置!! 親測可用

今天要做網站的國際化 包括頁面 和 資料庫層面 下午找了些網上例子 都不大能用,參考了幾篇文章 綜合下 終於找到個解決方案 1 配置檔案 兩處增加  a  dispatcherServlet.xm

Spring MVC中,基於XML配置和基於註解的依賴注入例項

一、首先是基於XML配置的依賴注入例項   在本例項中,Spring MVC並非主要講解內容,其檔案正規化不再重複,而有關依賴注入檔案包括:介面類car.java,實現了car介面的Taxi,java和Train.java。在User類中,有一個Car物件屬性。即此Car即

Spring MVC之最簡專案配置(全註解)

Environment: Java 1.8.0_131 maven 3.5.0 InteliJ IDEA 2017.1.4 tomcat 8.5.15 簡介 Spring 的目的在於簡化Java EE應用程式的開發,依賴注

Spring Mvc 3.1 之後如何配置messageConverters

<mvc:annotation-driven /> 是一種簡寫形式,完全可以手動配置替代這種簡寫形式,簡寫形式可以讓初學都快速應用預設配置方案。<mvc:annotation-driven /> 會自動註冊DefaultAnnotationHandl

Spring mvc 例項使用velocity檢視,解決中文亂碼問題

    上個星期讀了一些spring mvc原始碼,現在可以將之前的寫的簡單的例子貼出來,為以後的開發作些準備。 這是一個非常簡單的例子,就是使用SimpleFormController實現spring mvc的例子。 首先,在web.xml上配置DispatcherSer

Spring MVC的web.xml檔案配置詳解

原文地址:http://blog.csdn.net/u010796790/article/details/52098258 1、spring 框架解決字串編碼問題:過濾器 CharacterEncodingFilter(filter-name)  2、在web.xml配置監

Spring MVC返回json資料的配置方式

摘要:Spring MVC返回json資料的方式有以下幾種: (1)直接 PrintWriter 輸出 (2)使用 JSP 檢視 (3)使用Spring內建的支援本文說明的是使用Spring內建的功能。 Spring MVC返回json資料的方式有以下幾種:     (1

spring MVC 使用 hibernate validator驗證框架,國際化配置

dex erp fault reg path api turn regex oca spring mvc使用hibernate validator框架可以實現的功能: 1. 註解java bean聲明校驗規則。 2. 添加message錯誤信息源實現國際化配置。 3.

JSR-303 Spring MVC 訊息國際化 配置

本文中使用的個軟體版本(見最下方截圖):Spring:4.1.1JSR 303 Validator: 1.0.0JSR 303 Validator實現:hibernate 4.3.2說明:為什麼這裡選擇hibernate 4.3.2,而沒有選擇更高版本?原因:Hibernat

spring mvc 配置web.xml servlet.xml檔案配置以及出現異常的解決方案

 java.io.FileNotFoundException: class path resource [beans.xml] cannot be opened because it does not  exist Could not open ServletContext

spring-mvc開發模式相關配置

1.web.xml檔案配置 <!-- 1.配置DispatcherServlet -->   <servlet>   <servlet-name>springmvc</servlet-name>   <servlet-

spring mvc aop配置事務的相關配置

一共四個配置檔案包括web.xml spring-hibernate.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schem

spring配置出現字首 "tx" 未繫結、字首 "mvc" 未繫結等情況

在進行spring整合配置時,啟動專案日誌提示“元素 “tx:annotation-driven” 的字首 “tx” 未繫結等情況. 是因為沒有在配置檔案中定義tx開頭的名稱空間。 以tx為例,可在spring的配置檔案中,新增以下配置(紅色箭頭部分) :

SpringSpring MVC原理及配置詳解

進行 return sub sca scrip uil 線程安全 松耦合 必須 1.Spring MVC概述: Spring MVC是Spring提供的一個強大而靈活的web框架。借助於註解,Spring MVC提供了幾乎是POJO的開發模式,使得控制器的開發和測試更加簡

Spring MVC 配置

rri splay sep static type gets source handle webpack 1, RootConfig用來配置ContextLoadListener 1 @Configuration 2 //@Import(DataConf

Spring MVC配置

只有一個 col 純粹 相同 如果 http 註冊 name 指定 1. pring MVC的核心就是DispatcherServlet類,Spring MVC處理請求的流程如下圖所示: 2. Spring MVC中典型的上下文層次 當我們初始化一個Dispat

Spring Security簡明實踐及相關國際化處理

logs replace accept remember 沒有 dex glob ada XML 別人的都是最佳實踐,因為我目前的設置沒有按照參考文檔推薦,還是采用DelegatingFilterProxy,所以我只能說簡明實踐。先貼我的applicationCo