Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring annotation config, Не работает LocaleResolver 
V
    Опции темы
xoslv
Дата 30.5.2013, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Добрый день!
Пытаюсь заставить своё приложение работать со словарём из базы данных, так сказать, сделать его мултиязычным.
Приложение поднимаю с использованием Spring фремворка.
Подскажите, что я делаю не так и как это можно исправить, не работает LocaleResolver и LocaleChangeInterceptor

Вот мой конфиг:
Код

@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan("com.sprsec")
@PropertySource("classpath:application.properties")
@ImportResource("classpath:spring-security.xml")
public class WebAppConfig extends WebMvcConfigurerAdapter {
    
    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
    
    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
    private static final String PROPERTY_NAME_POOL_SIZE = "hibernate.pool_size";
     
    @Resource
    private Environment env;
    
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        
        dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
        
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource());
        sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
        sessionFactoryBean.setHibernateProperties(hibProperties());
        return sessionFactoryBean;
    }
    
    private Properties hibProperties() {
        Properties properties = new Properties();
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
        properties.put(PROPERTY_NAME_POOL_SIZE, env.getRequiredProperty(PROPERTY_NAME_POOL_SIZE));
        return properties;    
    }
    
    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }

    @Bean(name = "localeResolver")
    public LocaleResolver localeResolver() {
        CookieLocaleResolver resolver = new CookieLocaleResolver();
        resolver.setDefaultLocale(new Locale("ru"));
        return resolver;
    }

    @Bean(name = "messageSource")
    public AbstractMessageSource getMesageSource(){
        return new DatabaseMessageSource(sessionFactory().getObject());
    }

    @Bean
    public HandlerInterceptor localeChangeInterceptor(){
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("lang");
        return  localeChangeInterceptor;
    }

    @Bean(name = "annotationHandlerMapping")
    public HandlerMapping handlerMapping() {
        final DefaultAnnotationHandlerMapping ret = new DefaultAnnotationHandlerMapping();
        ret.setInterceptors(new Object[] { localeChangeInterceptor() });
        return ret;
    }

    @Bean
    public UrlBasedViewResolver setupViewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}



Уже неделю ломаю голову над проблемой, перекопал весь гугл. Народ в большенстве всё ещё предпочитает пользоваться XML конфигурацией и примеров с аннотациями очень мало. Глядя на XMLы вроде понимаю, какой класс что делает и какие зависимости ему надо, но воплотить это в своём варианте покак никак не удаётся.

На всякий случай привожу код DatabaseMessageSource, малоли кому понадобится:
Код

public class DatabaseMessageSource extends AbstractMessageSource {

    private final Map<String, Map<String, String>> properties = new HashMap<String, Map<String, String>>();

    private SessionFactory sessionFactory;

    public DatabaseMessageSource(SessionFactory sessionFactory) {
        super();
        this.sessionFactory = sessionFactory;
        this.setUseCodeAsDefaultMessage(true);
        reload();
    }

    @Override
    protected String resolveCodeWithoutArguments(String code, Locale locale) {
        return getText(code, locale);
    }

    @Override
    protected MessageFormat resolveCode(String code, Locale locale) {
        String msg = getText(code, locale);
        MessageFormat result = createMessageFormat(msg, locale);
        return result;
    }

    /**
     * @param code
     * @param locale
     * @return
     */
    private String getText(String code, Locale locale) {
        Map<String, String> localizedText = properties.get(code);
        String textForCurrentLanguage = null;
        if (localizedText != null) {
            textForCurrentLanguage = localizedText.get(locale.getLanguage());
            if (textForCurrentLanguage == null) {
                textForCurrentLanguage = localizedText.get(Locale.US.getLanguage());
            }
        }
        return textForCurrentLanguage != null ? textForCurrentLanguage : code;
    }

    private Map<String, Map<String, String>> refreshProperties() {
        properties.clear();
        properties.putAll(loadTexts());
        return properties;
    }

    public Session openSession(){
        return sessionFactory.openSession();
    }

    protected Map<String, Map<String, String>> loadTexts() {
        Map<String, Map<String, String>> myProp = new HashMap<String, Map<String, String>>();
        Query query = openSession().createSQLQuery("select m.code, m.ru, m.lv, m.en from jp_dictionary as m");
        Iterator result = query.list().iterator();
        while( result.hasNext() ){
            Object[] row = (Object[]) result.next();
            String code = row[0].toString();
            Map<String, String> dataRU = new HashMap<String, String>();
            Map<String, String> dataLV = new HashMap<String, String>();
            Map<String, String> dataEN = new HashMap<String, String>();
            dataRU.put("ru",row[1].toString());
            dataLV.put("lv",row[2].toString());
            dataEN.put("en",row[3].toString());
            myProp.put(code, dataRU);
            myProp.put(code, dataLV);
            myProp.put(code, dataEN);
        }
        return myProp;
    }

    /**
     * Reload all codes.
     */
    public void reload() {
        refreshProperties();
    }

}


Буду рад любой полезной информации и напутствию!
--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
MisterCleric
Дата 30.5.2013, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. А дебажить не пробовал?
Похоже на то, что твой DispatcherServlet не видит бина "localeResolver" при своей инициализации:
DispatcherServlet.initLocaleResolver(ApplicationContext context)
Ну и аналогичная проблема с LocaleChangeInterceptor.
Показывай свой web.xml
Ну и заодно посмотри сюда:
http://geowarin.wordpress.com/2013/01/23/c...vc-3-2-project/
http://static.springsource.org/spring/docs...nitializer.html


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
xoslv
Дата 30.5.2013, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Ввиду того что спинг поднимается на аннотациях, web.xml почти пустой.
Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <error-page>
        <error-code>403</error-code>
        <location>/error/403</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/error/404</location>
    </error-page>


    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>


Добавлено через 11 минут и 27 секунд
И у меня уже есть Initializer:
Код

package com.sprsec.init;

import ...


public class Initializer implements WebApplicationInitializer {

    public void onStartup(ServletContext servletContext)
            throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(WebAppConfig.class);

        servletContext.addListener(new ContextLoaderListener(ctx));

        ctx.setServletContext(servletContext);

        Dynamic servlet = servletContext.addServlet("dispatcher",
                new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);

    }

}


--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
MisterCleric
Дата 30.5.2013, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Всё выглядит нормально.
Так что же мешает пробежаться в дебаге, дабы убетиться, что DispatcherServlet делает то, что ты от него хочешь?


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
xoslv
Дата 30.5.2013, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Я пробежался, и он вроде даже делает то что я хочу!
Код

...
2013-05-30 11:45:20 DEBUG ConfigurationClassBeanDefinitionReader:263 - Registering bean definition for @Bean method com.sprsec.init.WebAppConfig.localeChangeInterceptor()
2013-05-30 11:45:20 DEBUG ConfigurationClassBeanDefinitionReader:263 - Registering bean definition for @Bean method com.sprsec.init.WebAppConfig.localeResolver()
2013-05-30 11:45:21 DEBUG BasicTypeRegistry:143 - Adding type registration locale -> org.hibernate.type.LocaleType@160cf777
2013-05-30 11:45:21 DEBUG BasicTypeRegistry:143 - Adding type registration java.util.Locale -> org.hibernate.type.LocaleType@160cf777
...
2013-05-30 11:45:22 DEBUG BeanNameUrlHandlerMapping:86 - Rejected bean name 'localeChangeInterceptor': no URL paths identified
2013-05-30 11:45:22 DEBUG BeanNameUrlHandlerMapping:86 - Rejected bean name 'localeResolver': no URL paths identified
...
2013-05-30 11:45:23 DEBUG DefaultListableBeanFactory:217 - Creating shared instance of singleton bean 'localeChangeInterceptor'
2013-05-30 11:45:23 DEBUG DefaultListableBeanFactory:430 - Creating instance of bean 'localeChangeInterceptor'
2013-05-30 11:45:23 DEBUG DefaultListableBeanFactory:245 - Returning cached instance of singleton bean 'webAppConfig'
2013-05-30 11:45:23 DEBUG DefaultListableBeanFactory:504 - Eagerly caching bean 'localeChangeInterceptor' to allow for resolving potential circular references
2013-05-30 11:45:23 DEBUG DefaultListableBeanFactory:245 - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
2013-05-30 11:45:23 DEBUG DefaultListableBeanFactory:458 - Finished creating instance of bean 'localeChangeInterceptor'
...
2013-05-30 11:45:23 DEBUG DispatcherServlet:115 - Initializing servlet 'dispatcher'
2013-05-30 11:45:23 INFO  DispatcherServlet:444 - FrameworkServlet 'dispatcher': initialization started
2013-05-30 11:45:23 DEBUG DispatcherServlet:465 - Unable to locate MultipartResolver with name 'multipartResolver': no multipart request handling provided
2013-05-30 11:45:23 DEBUG DefaultListableBeanFactory:245 - Returning cached instance of singleton bean 'localeResolver'
2013-05-30 11:45:23 DEBUG DispatcherServlet:480 - Using LocaleResolver [org.springframework.web.servlet.i18n.CookieLocaleResolver@1ce00793]
...
2013-05-30 11:45:25 DEBUG DispatcherServlet:902 - Last-Modified value for [/] is: -1
2013-05-30 11:45:25 DEBUG CookieLocaleResolver:104 - Parsed cookie value [ru] into locale 'ru'
...
2013-05-30 11:45:30 DEBUG CookieLocaleResolver:193 - Added cookie with name [org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE] and value [ru]
2013-05-30 11:45:30 DEBUG DispatcherServlet:1178 - Rendering view [org.springframework.web.servlet.view.JstlView: name 'login-main'; URL [/WEB-INF/pages/login-main.jsp]] in DispatcherServlet with name 'dispatcher'
2013-05-30 11:45:30 DEBUG JstlView:236 - Forwarding to resource [/WEB-INF/pages/login-main.jsp] in InternalResourceView 'login-main'


Но на странице нет никаких изменений, текст не меняется. :(

Это сообщение отредактировал(а) xoslv - 30.5.2013, 13:02
--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
MisterCleric
Дата 30.5.2013, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

Но на странице нет никаких изменений, текст не меняется. :(

А как ты это понимаешь? 
Почему ты вообще предполагаешь, что он должен меняться?
Ты используешь на странице
<spring:message code="..."/>
http://viralpatel.net/blogs/spring-3-mvc-i...torial-example/
?
Вызываются ли методы твоего DatabaseMessageSource?
И в "дебаге", я имел в виду, через break-points в исходниках


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
xoslv
Дата 30.5.2013, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Solved! Решено!
Ошибка была не в конфигурации а в методе loadText класса DatabaseMessageSource.
Огромное спасибо MisterCleric за то что натолкнул на мысль и показал в каком направлении двигаться.
Если кому-то надо, пишите, поделюсь готовым решением!
--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.