При добавлении кириллических данных в базу отображаются иероглифы
При добавлении кириллических данных в базу отображаются иероглифы. База данных H2. Везде где можно поставил кодировку UTF-8.
@Configuration
@EnableJpaRepositories(basePackages = "application.repo")
@ComponentScan(basePackages = "application")
public class DataServiceConfig {
@Bean
public DataSource dataSource() {
try {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).addScripts("classpath:db/shema.sql",
"classpath:db/insert.sql").build();
} catch (Exception e) {
return null;
}
}
@Bean
public Properties hibernateProperties() {
Properties hibernateProp = new Properties();
hibernateProp.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
// hibernateProp.put("hibernate.hbm2ddl.auto", "create-drop");
hibernateProp.put("hibernate.format_sql", true);
hibernateProp.put("hibernate.use_sql_comments", true);
hibernateProp.put("hibernate.show_sql", true);
hibernateProp.put("hibernate.max_fetch_depth", 3);
hibernateProp.put("hibernate.jdbc.batch_size", 10);
hibernateProp.put("hibernate.jdbc.fetch_size", 50);
return hibernateProp;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setPackagesToScan("application.entities");
factoryBean.setDataSource(dataSource());
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factoryBean.setJpaProperties(hibernateProperties());
factoryBean.afterPropertiesSet();
return factoryBean.getNativeEntityManagerFactory();
}
@Bean
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager(entityManagerFactory());
}
}
class SingerController
package application.web;
@Controller
@RequestMapping("/singers")
public class SingerController {
private static final Logger log = LoggerFactory.getLogger(SingerController.class);
private SingerService singerService;
private MessageSource messageSource;
@Autowired
public void setSingerService(SingerService singerService) {
this.singerService = singerService;
}
@Autowired
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
@RequestMapping(method = RequestMethod.GET)
public String list(Model uiModel){
log.info("listing singers");
List<Singer> singers = singerService.findAll();
uiModel.addAttribute("singers" , singers);
log.info("No. of singers: "+ singers.size());
return "singers/list";
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String show(@PathVariable("id") Long id, Model uiModel){
log.info("просмотр певца по id {}", id);
Singer singer = singerService.findById(id);
uiModel.addAttribute("singer", singer);
log.info("певец найден");
return "singers/show";
}
@RequestMapping(value = "/{id}", params = "form", method = RequestMethod.POST)
public String update(@Valid Singer singer, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest,
RedirectAttributes redirectAttributes, Locale locale){
log.info("Updating singer");
if(bindingResult.hasErrors()){
uiModel.addAttribute("message", new Message("error", messageSource.getMessage("singer_save_fail",
new Object[]{}, locale)));
uiModel.addAttribute("singer", singer);
return "singers/update";
}
uiModel.asMap().clear();
redirectAttributes.addFlashAttribute("message", new Message("success", messageSource.getMessage("singer_save_success",
new Object[]{}, locale)));
singerService.save(singer);
return "redirect:/singers/" + UrlUtil.encodeUrlPathSegment(singer.getId().toString(), httpServletRequest);
}
@RequestMapping(value = "/{id}", params = "form", method = RequestMethod.GET)
public String updateForm(@PathVariable("id") Long id, Model uiModel){
uiModel.addAttribute("singer", singerService.findById(id));
return "singers/update";
}
}
class WebConfig
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"application"})
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/").setCachePeriod(31556926);
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("WEB-INF/i18n/messages", "WEB-INF/i18n/application");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setFallbackToSystemLocale(false);
return messageSource;
}
@Bean
ResourceBundleThemeSource themeSource() {
return new ResourceBundleThemeSource();
}
@Bean
ThemeChangeInterceptor themeChangeinterceptor() {
return new ThemeChangeInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
registry.addInterceptor(themeChangeinterceptor());
}
@Bean
LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang");
return interceptor;
}
@Bean
CookieLocaleResolver localeResolver() {
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setDefaultLocale(Locale.ENGLISH);
cookieLocaleResolver.setCookieMaxAge(3600);
cookieLocaleResolver.setCookieName("locale");
return cookieLocaleResolver;
}
@Bean
CookieThemeResolver themeResolver() {
CookieThemeResolver cookieThemeResolver = new CookieThemeResolver();
cookieThemeResolver.setDefaultThemeName("standard");
cookieThemeResolver.setCookieMaxAge(3600);
cookieThemeResolver.setCookieName("theme");
return cookieThemeResolver;
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("singers/list");
}
@Bean
UrlBasedViewResolver tilesViewResolver() {
UrlBasedViewResolver tilesViewResolver = new UrlBasedViewResolver();
tilesViewResolver.setViewClass(TilesView.class);
return tilesViewResolver;
}
@Bean
TilesConfigurer tilesConfigurer() {
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setDefinitions(
"/WEB-INF/layouts/layouts.xml",
"/WEB-INF/views/singers/views.xml"
);
tilesConfigurer.setCheckRefresh(true);
return tilesConfigurer;
}
@Bean
public DateFormatter dateFormatter(){
return new DateFormatter();
}
@Override
public void addFormatters(FormatterRegistry formatterRegistry){
formatterRegistry.addFormatter(dateFormatter());
}
}
class WebInitializer
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{
DataServiceConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{
WebConfig.class
};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter cef = new CharacterEncodingFilter();
cef.setEncoding("UTF-8");
cef.setForceEncoding(true);
return new Filter[]{new HiddenHttpMethodFilter(), cef};
}
}
Ответы (1 шт):
Автор решения: drakonoved
→ Ссылка
Кодировка символов в HTTP запросах и ответах в spring-webmvc
См. метод extendMessageConverters из интерфейса WebMvcConfigurer:
A hook for extending or modifying the list of converters after it has been configured. This may be useful for example to allow default converters to be registered and then insert a custom converter through this method.
т.е. стандартный набор конвертеров можно дополнить своими, или изменить существующие:
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.forEach(converter -> {
if (converter instanceof AbstractHttpMessageConverter) {
((AbstractHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setWriteAcceptCharset(false);
}
} else if (converter instanceof FormHttpMessageConverter) {
((FormHttpMessageConverter) converter).setCharset(StandardCharsets.UTF_8);
((FormHttpMessageConverter) converter).setMultipartCharset(StandardCharsets.UTF_8);
}
});
}
}