2013-12-19 67 views
4

編輯:tl; dr:當保存變音器時,它們被破壞(變成Ã)。我現在意識到,我的問題的其餘部分與這個問題沒有任何關係。Primefaces更新銷燬Umlauts

我正在通過JBoss,Hibernate,Infinispan Cache,derby,Maven和Primefaces構建一個webapp。

我顯示一個從數據庫中獲取數據的頁面,該數據庫中有正確的數據(帶有元音變音)。它正確顯示在 <p:dataTable id="dt1" var="as" value="#{aSBean.elementList}" ...>

當從表中選擇一個條目時彈出一個對話框。對話框代碼的主要部分是

<p:dialog header="AS Detail" widgetVar="asDialog" resizable="false" id="asDlg" 
      showEffect="fade" hideEffect="fade" modal="true" styleClass="detailDialog" > 
     <h:panelGrid id="display" > 

      <h:outputText value="Bemerkung" /> 
      <h:inputText value="#{aSBean.selectedElement.bemerkungTxt}" /> 
      <h:outputText value="Bearbeiter" /> 
      <h:outputText value="#{fehlerBean.selectedElement.bearbeiterNr}" /> 

     </h:panelGrid> 
     <h:panelGrid id="diaBtnDisplay"> 
      <p:commandButton value="Speichern" update=":form1:dt1" id="save" validateClient="true" actionListener="#{aSBean.save}"/> 
      <p:commandButton value="Abbrechen" id="cancel"> 
       <f:ajax event="click" onevent="asDlg.hide()" /> 
      </p:commandButton>   
     </h:panelGrid> 

</p:dialog> 

現在,竟然沒有在Abbrechen,命令按鈕的更新屬性,但仍當我按下這個按鈕數據表得到更新。如果我通過右上角的X離開對話框,則不會。

但是當我按下Abbrechen時,數據表得到更新,我的ä變成ä。但它只會對所選元素這樣做。這裏是我的支持大豆代碼片段:

public Arbeitsschluessel selectedElement = new Arbeitsschluessel(); 
public Arbeitsschluessel newElement = new Arbeitsschluessel(); 

public Arbeitsschluessel getSelectedElement() { 
    return selectedElement; 
} 

public void setSelectedElement(Arbeitsschluessel selectedValue) { 
    if (selectedValue != null) { 
     this.selectedElement = selectedValue; 
    } 
} 

public List<Arbeitsschluessel> getElementList() { 
     return elementList; 
    } 

所以一定沒什麼特別的。我的HTML頁面開始於<?xml version="1.0" encoding="UTF-8"?>,我也有以下內容<meta http-equiv="content-type" content="text/html; charset=utf-8" />

我按了Abbrechen按鈕後調試了更新過程,並且對於我的第n個元素,as var的內容是錯誤的。每次調用堆棧看起來都是一樣的,所以我不能說在什麼時候這個值會被破壞。

如果我通過一個按鈕(dao.findAll從數據庫)重新加載數據表,除了當我將一個錯誤的值保存到數據庫中時,所有內容都會再次正確顯示。所以並不是數據庫值已損壞。任何幫助感謝!

編輯:代碼在打開的對話框:

<p:commandButton id="selectButton" update=":form1:display" oncomplete="PF('asDialog').show()" icon="" title="View"> 
        <f:setPropertyActionListener value="#{as}" target="#{aSBean.selectedElement}" /> 
</p:commandButton> 
+0

對於它的價值,我觀察了相同的變音破損在postgres數據庫上使用JSF-2.2和Richfaces(這裏沒有Primefaces)。我懷疑JSF/Wildfly的問題。 – mabi

+0

你是對的,當你沒有設置任何'行動'時'oncomplete'不起作用。在commandButton上使用'process =「@ this」'並使用'onclick =「asDlg.hide()」'而不是f:ajax。請在您打開對話框的位置發佈代碼。 – user1983983

+0

驗證:你在使用Weld-2嗎?我已經指出[這個FAQ條目](http://weld.cdi-spec.org/documentation/#3)來解釋變音人爲什麼會被損壞。 – mabi

回答

3

我找到了答案。一個人使用CharacterEncodingFilter

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

public class CharacterEncodingFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
      throws IOException, ServletException { 
     servletRequest.setCharacterEncoding("UTF-8"); 
     servletResponse.setContentType("text/html; charset=UTF-8"); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { } 
} 

,然後添加以下行到web.xml在WEB-INF文件夾:

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>your.package.CharacterEncodingFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+1

作爲參考,這也是[在omnifaces的CharacterEncodingFilter頁面中描述的](http://showcase.omnifaces.org/filters/CharacterEncodingFilter)。 – mabi