2016-11-21 57 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編碼,我還在server.xml中的連接器配置中添加了URIEncoding =「UTF-8」。我還需要補充什麼,或者我做錯了什麼?

+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, "/*"); } } 

。你檢查過列的編碼了嗎? –

+0

我正在使用postgres 9,我能夠插入正確的值與原始查詢,並在以後查看正確顯示它們,問題發生後,我嘗試從應用程序窗體保存的東西,我使用@Valid註釋和BindingResult對象作爲行動的參數負責保存數據 – Markownikow

回答

0

您可以設置斷點並檢查從字節(UTF-8)到Unicode的編碼是否正確完成。 接下來要做的是檢查數據庫/表的排序規則。 當你創建一個數據庫/表時,你指定了整理,相當於一個字符集(你通常在安裝過程中選擇一個默認值),如果這不支持你存儲的字符,你可能會被垃圾破壞。

+0

數據已經在控制器中被破壞,所以當我在調用/打印實體的值之前保存已經不正確的請求參數 - 如果我在HttpServletRequest對象上調用getParameter(「name」),我會得到無效的編碼值,但我叫setCharacterEncoding(「UTF-8」)和內部行動,我可以看到它的影響,但參數的價值仍然是錯誤的。 – Markownikow

+0

您是否在URL上發佈表單數據或編碼數據。通常,表單數據以與表單所在頁面相同的編碼進行發佈,否則可以使用accept-charset進行配置。 URL參數應該是URLEncoded,但由於這基本上是一個十六進制編碼,所以您需要告訴Servlet容器如何處理URI。在Tomcat上,這是在server.xml中的定義中完成的,使用xml屬性URIEncoding =「UTF-8」。 –

+0

感謝您的建議,我已經嘗試過接受字符集屬性(使用jsp表單標籤及其acceptCharset =「UTF-8)」頁面也有:<%@ page pageEncoding =「UTF-8」%>,將URIEncoding添加到server.xml是我嘗試的第一件事,但不幸的是它並沒有解決問題 – Markownikow

相關問題