2016-11-21 5 views
1

У меня проблема с сохранением данных из форм с Hibernate, в основном кодировка идет не так, поэтому странные символы сохраняются в базе данных и заполняются как следствие в вводах форм. Это конфигурация, которую я подготовил до сих пор:Ошибка кодирования Spring/Hibernate при сохранении объекта

в web.xml

<filter> 
    <filter-name>SetCharacterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>SetCharacterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

в applicationContext.xml (пробовал 'UTF-8' оба рисунка и 'utf8')

<property name="url" value="jdbc:postgresql://localhost:5432/mydb?characterEncoding=UTF-8" /> 

.. .

<property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL9Dialect</prop> 
       <prop key="hibernate.connection.CharSet">utf8</prop> 
       <prop key="hibernate.connection.characterEncoding">utf8</prop> 
       <prop key="hibernate.cache.use_query_cache">true</prop> 
       <prop key="hibernate.cache.use_second_level_cache">true</prop> 
       <prop key="hibernate.cache.region.factory_class"> 
        org.hibernate.cache.ehcache.EhCacheRegionFactory 
       </prop> 
       <prop key="hibernate.connection.useUnicode">true</prop> 
       <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop> 
       <prop key="show_sql">true</prop> 

       <prop key="hibernate.c3p0.min_size">5</prop> 
       <prop key="hibernate.c3p0.max_size">20</prop> 
       <prop key="hibernate.c3p0.timeout">300</prop> 
       <prop key="hibernate.c3p0.max_statements">50</prop> 
       <prop key="hibernate.c3p0.idle_test_period">3000</prop> 
      </props> 
</property> 

pom.xml

<properties> 
     <spring.version>4.1.2.RELEASE</spring.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

базы данных, jsp-файлы и проект также имеют кодировку ut8, также я добавил URIEncoding = "UTF-8" в конфигурацию моего соединителя в server.xml. Что еще мне нужно добавить или что я делаю неправильно?

+0

Какую базу данных вы используете. Вы проверили кодировку столбцов? –

+0

Я использую postgres 9, я могу вставить правильные значения с необработанным запросом и отобразить их правильно в представлении позже, проблема возникает после того, как я пытаюсь сохранить что-то из формы приложения, я использую @Valid аннотацию и объект BindingResult в качестве аргументов действия ответственный за сохранение данных – Markownikow

ответ

0

Решение:

@Order(1) 
public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer { 

    @Override 
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { 
     FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter()); 
     characterEncodingFilter.setInitParameter("encoding", "UTF-8"); 
     characterEncodingFilter.setInitParameter("forceEncoding", "true"); 
     characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*"); 
    } 

} 

на основе комментариев от CharacterEncodingFilter don't work together with Spring Security 3.2.0

0

Вы можете установить точку останова и проверить правильность кодировки из байтов (UTF-8) в Юникод. Следующее, что нужно сделать, это проверить сортировку из базы данных/таблицы. При создании базы данных/таблицы вы указываете сопоставление, эквивалент кодировки (обычно вы выбираете значение по умолчанию во время установки), если это не поддерживает символы, которые вы храните, вы можете получить мусор.

+0

данные уже сломаны в контроллере, поэтому, когда я отлаживаю/печатаю значение объекта в действии, прежде чем сохранять его уже неверно, то же самое для параметра запроса - если я вызываю getParameter («имя») объекта HttpServletRequest, я получаю недопустимый код значение, но я вызвал setCharacterEncoding («UTF-8») и внутри действия, я вижу, что это повлияло, но снова значение параметра все еще не так. – Markownikow

+0

Вы отправляете данные формы или данные кодирования по URL-адресу. Обычно данные формы публикуются в той же кодировке, что и страница, на которой находится форма, в противном случае вы можете использовать accept-charset для ее настройки. Параметры URL должны быть URLEncoded, но поскольку это в основном шестнадцатеричное кодирование, вам нужно сообщить контейнеру Servlet, как обрабатывать URI. В Tomcat это делается в определении в server.xml, используя атрибут xml URIEncoding = "UTF-8". –

+0

Спасибо за ваши предложения, я уже пробовал атрибут accept-charset (с тегом формы jsp и его acceptCharset = "UTF-8), также на странице есть: <% @ page pageEncoding =" UTF-8 "%>, добавив URIEncoding в server.xml был одним из первых, что я пробовал, но, к сожалению, он не решает проблему. – Markownikow

Смежные вопросы