JSF Character Encoding Problem

Todo

Aktives Mitglied
Hi an alle,

ich verzweifel so langsam richtig!

Also habe eine <h:form> in einem Template geladen, wo überall UTF-8 deklariert ist.
Leider kommen die deutschen Umlaute in der Datenbank komplett falsch an.
Ein ö wird zum ö...sieht also nach Encoding Fehler aus. Jedoch wird auch schon beim Fehlerhaften Validieren aus dem ö diese Zeichen ö (also beim fehlerhafter Validierung).

Ein Auszug aus der Form:
Java:
<h:form enctype="multipart/form-data" id="myForm" acceptcharset="UTF-8" prependId="false">
            <h:panelGroup id="messagePanel" layout="block">
                <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/>
            </h:panelGroup>

            <p:panelGrid columns="2" style="min-width: 100%;" >
                <f:facet name="header">
                    <h:outputText id="test" value="#{msg.CreateArtikelTitle}"></h:outputText>
                </f:facet>

                <h:outputLabel value="#{msg.CreateArtikelLabel_name}" for="name" />
                <p:inputText id="name" value="#{artikelMB.artikel.name}"  title="#{msg.CreateArtikelTitle_name}" required="true" requiredMessage="Bitte einen Namen angeben."/>
</h:form>

In dem Template wurde oben deklariert:
Java:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core">

    <h:head>
        <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
        <link href="/resources/css/default.css" rel="stylesheet" type="text/css" />
        <script src="/resources/javascript/jscodes.js" type="text/javascript" ></script>
    </h:head>

......

So jetzt dachte ich, hm sollte ja an dem bekannten Problem liegen das der Browser das Encoding nicht mitschickt und habe noch einen zusätlzichen EncodingFilter reingepackt:
Java:
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }

Brachte immer noch keine Erfolg.
Dann habe ich mal ein PhaseLIstener noch erstellt der mir den CharacterEncoding von der Response und vom Request für jede Phase ausgibt, da steht aber auch alles auf UTF-8
Java:
*PhaseTracker1: Before Phase: RESTORE_VIEW 1. <---/faces ResponseEncoding:UTF-8 RequestEncoding:UTF-8
*PhaseTracker1: After Phase: RESTORE_VIEW 1  ResponseEncoding:UTF-8 RequestEncoding:UTF-8
*PhaseTracker1: Before Phase: APPLY_REQUEST_VALUES 2  ResponseEncoding:UTF-8 RequestEncoding:UTF-8
*PhaseTracker1: After Phase: APPLY_REQUEST_VALUES 2  ResponseEncoding:UTF-8 RequestEncoding:UTF-8
*PhaseTracker1: Before Phase: PROCESS_VALIDATIONS 3  ResponseEncoding:UTF-8 RequestEncoding:UTF-8
*PhaseTracker1: After Phase: PROCESS_VALIDATIONS 3  ResponseEncoding:UTF-8 RequestEncoding:UTF-8
*PhaseTracker1: Before Phase: RENDER_RESPONSE 6  ResponseEncoding:UTF-8 RequestEncoding:UTF-8
*PhaseTracker1: After Phase: RENDER_RESPONSE 6--->/pages/artikel/Create.xhtml  ResponseEncoding:UTF-8 RequestEncoding:UTF-8


Hat jemand noch eine gute Idee???
 
schmeiss im Form das acceptcharset mal raus.

-> der Filter ist die richtige Wahl.
Hast du Ihn auch in der Web.xml eingebunden ?

das letzte was du noch prüfen kannst ist die Datenbank collation: utf8_general_ci

Nur noch mal der Filter zu sicherheit:
Java:
public class UTF8Filter implements Filter {

    public void init(FilterConfig config) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

    public void destroy() {
    }
}

web.xml
Java:
<filter>
    <filter-name>UTF8Filter</filter-name>
    <filter-class>mypackage.UTF8Filter</filter-class>
</filter>

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

grüße
 
Ah jetzt habe ich zumindest den Fehler geortet.

Also mit dem Filter geht das wohl bei einem Formular ohne Fileuppload.
Da wo der Fehler auftritt ist eine Multipart Form mit einem Primefaces FileUploadFilter, der zerstört mir mein Encoding Filter, bei Formularen ohne einen Dateiupload funktioniert es ohne Probleme.

EDIT:

Mit hilfe der beiden neuen Klasse MultipartRequest und FileUploadFilter funktioniert es dann auch endlich. Für jeden der daran auch mal verzweifelt, es war wohl ein Bug und ist gefixed worden.

Hier noch den passenden Report:
Issue 3002 - primefaces - FileUploadFilter Parameter Decode with Encoding. - Next Generation Component Suite - Google Project Hosting
 
Zuletzt bearbeitet:

Zurück
Oben