Bladeren bron

新增主题和国际化配置

周浩 9 jaren geleden
bovenliggende
commit
49469495be

+ 106 - 1
hsweb-web-controller/src/main/java/org/hsweb/web/controller/ControllerAutoConfiguration.java

@@ -1,7 +1,25 @@
 package org.hsweb.web.controller;
 
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.ReloadableResourceBundleMessageSource;
+import org.springframework.ui.context.support.ResourceBundleThemeSource;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.ThemeResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.i18n.CookieLocaleResolver;
+import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
+import org.springframework.web.servlet.theme.CookieThemeResolver;
+import org.springframework.web.servlet.theme.ThemeChangeInterceptor;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Locale;
 
 /**
  * Created by zhouhao on 16-5-6.
@@ -10,6 +28,93 @@ import org.springframework.context.annotation.Configuration;
 @ComponentScan(
         basePackages = {"org.hsweb.web.controller"}
 )
-public class ControllerAutoConfiguration {
+public class ControllerAutoConfiguration extends WebMvcConfigurerAdapter {
+
+    @Bean(name = "messageSource")
+    public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource() {
+        ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
+        reloadableResourceBundleMessageSource.setBasenames("classpath*:messages/", "classpath*:valid/validation");
+        reloadableResourceBundleMessageSource.setUseCodeAsDefaultMessage(false);
+        reloadableResourceBundleMessageSource.setFallbackToSystemLocale(true);
+        return reloadableResourceBundleMessageSource;
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        ThemeChangeInterceptor themeChangeInterceptor = new ThemeChangeInterceptor() {
+            @Override
+            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
+                String newTheme = request.getParameter(getParamName());
+                if (newTheme != null) {
+                    ThemeResolver themeResolver = cookieThemeResolver();
+                    if (themeResolver != null) {
+                        themeResolver.setThemeName(request, response, newTheme);
+                    }
+                }
+                return true;
+            }
+        };
+        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor() {
+            @Override
+            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
+                String newLocale = request.getParameter(getParamName());
+                if (newLocale != null) {
+                    if (checkHttpMethod(request.getMethod())) {
+                        LocaleResolver localeResolver = cookieLocaleResolver();
+                        if (localeResolver != null) {
+                            try {
+                                localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));
+                            } catch (IllegalArgumentException ex) {
+                                if (isIgnoreInvalidLocale()) {
+                                    logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage());
+                                } else {
+                                    throw ex;
+                                }
+                            }
+                        }
+                    }
+                }
+                // Proceed in any case.
+                return true;
+            }
+
+            private boolean checkHttpMethod(String currentMethod) {
+                String[] configuredMethods = getHttpMethods();
+                if (ObjectUtils.isEmpty(configuredMethods)) {
+                    return true;
+                }
+                for (String configuredMethod : configuredMethods) {
+                    if (configuredMethod.equalsIgnoreCase(currentMethod)) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+        };
+        localeChangeInterceptor.setHttpMethods("GET");
+        registry.addInterceptor(localeChangeInterceptor);
+        registry.addInterceptor(themeChangeInterceptor);
+    }
+
+    @Bean(name="localeResolver")
+    public CookieLocaleResolver cookieLocaleResolver() {
+        CookieLocaleResolver resolver = new CookieLocaleResolver();
+        resolver.setDefaultLocale(Locale.CHINA);
+        return resolver;
+    }
+
+    @Bean
+    public ResourceBundleThemeSource themeSource() {
+        ResourceBundleThemeSource resourceBundleThemeSource = new ResourceBundleThemeSource();
+        resourceBundleThemeSource.setBasenamePrefix("theme.");
+        return resourceBundleThemeSource;
+    }
+
+    @Bean(name="themeResolver")
+    public CookieThemeResolver cookieThemeResolver() {
+        CookieThemeResolver cookieThemeResolver = new CookieThemeResolver();
+        cookieThemeResolver.setDefaultThemeName("default");
+        return cookieThemeResolver;
+    }
 
 }