Добрый день! Пытаюсь заставить своё приложение работать со словарём из базы данных, так сказать, сделать его мултиязычным. Приложение поднимаю с использованием 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(); }
}
|
Буду рад любой полезной информации и напутствию! |