Zum Inhalt springen

JSF Problem mit Convert und Validation


Empfohlene Beiträge

Geschrieben

Hallo Leute,

habe ein ziemliches Problem mit der Erweiterung eines JSF-Projektes.

Aber ganz kurz zum Projekt.

Projekt WebLogViewer (wlv)

Grundsätzlich geht es darum Logs von Servern (durch Agenten) abzuholen und diesen auf einer zentralen Weboberfläche bereit zu stellen.

Komplett in Java geschrieben bzw die Weboberfläche mit JSF.

Zu meiner Aufgabe

Es gibt auf der Weboberfläche eine Funktion mit der man Agenten hinzufügen kann.

Diese Funktion sollte ich um ein DropDown-Feld erweitern (Auswahl ob Windows oder Unix Server).

(Die Erweiterungen im Hintergrund für die Datenbank und das Eintragen dieses Feldes sind schon abgearbeitet)

Hier rauchts aber!


form:adminOS: Validierungsfehler: Wert ist keine gültige Auswahl form:adminOS: Validierungsfehler: Wert ist keine gültige Auswahl 

Hier mal ein Ausschnitt der XHTML-Datei
 

<ui:define name="content">

                <h:form id="form">

                    <div class="editForm">

                        <h3>${title}</h3>

                        <br/>


                        <h2>Eigenschaften</h2>

                        <br/>

                        <t:panelGrid border="0" columns="2" cellpadding="3" >

                            <!-- name -->

                            <wlv:gridInput label="Name"

                                           value="${AdminAgentBean.currentItem.name}" immediate="false"

                                           id="agentName" required="true" title="Namen des Agents">

                            </wlv:gridInput>

                            <!-- uri -->

                            <wlv:gridInput label="URI"

                                           value="${AdminAgentBean.currentItem.uri}" immediate="false"

                                           id="agentURI" required="true" title="Vollständige URI des Agenten">

                            </wlv:gridInput>


                            <!-- agent os -->

                            <h:panelGroup>

                                OS Name

                            </h:panelGroup>

                            <h:panelGroup>

                                <h:selectOneMenu value="${AdminAgentBean.currentItem.os}" id="adminOS" title="Betriebsystem des Agents">

                                    <t:selectItems value="${AdminAgentOSBean.items}" var="item" itemLabel="#{item.name}" itemValue="#{item}"/>

                                    <f:converter converterId="AgentConfigOSConverter"/>

                                </h:selectOneMenu>

                            </h:panelGroup>


                            <!-- description -->

                            <h:panelGroup>

                                Beschreibung

                            </h:panelGroup>

                            <h:panelGroup>

                                <h:inputTextarea rows="4" cols="70" required="false"

                                                 value="${AdminAgentBean.currentItem.description}" styleClass="standard" />

                            </h:panelGroup>


                            <!-- show in log's agent list -->

                            <h:panelGroup>

                                Sonstiges

                            </h:panelGroup>

                            <h:panelGroup>

                                <label>

                                    <h:selectBooleanCheckbox  value="${AdminAgentBean.currentItem.eligibleForLogFiles}"/>

                                    Agent ist für Logs auswählbar

                                </label>

                                <label>

                                    <h:selectBooleanCheckbox  value="${AdminAgentBean.currentItem.remoteManagable}"/>

                                    Agent kann über Server verwaltet werden

                                </label>

                            </h:panelGroup>

                        </t:panelGrid>



                        <br/>

                        <div class="buttonArray">

                            <h:commandButton immediate="true" action="${AdminAgentBean.cancelEdit}" class="button" value="Abbrechen"/>

                            <h:commandButton action="${AdminAgentBean.saveItem}" class="button" value="Speichern"/>

                        </div><br/>

                    </div>

                </h:form>


                <a4j:keepAlive beanName="AdminAgentBean" />

            </ui:define>

Zum besseren Verständnis: Datenbank Sicht Es gibt eine Tabelle Agentconfig, die die verschiedenen Agenten enthält. Diese hat eine Viele zu 1 Verbindung zur Tabelle Operationsystem, die die möglichen Betriebssysteme enthält. Operationsystem enthält lediglich 1 UNIX 2 Windows Java Sicht Es gibt das Object AgentConfig Agentconfig hat ein Object mit namen OS. OS ist das Object AgentConfigOS Der Fehler liegt wohl irgendwo in dem Convert, der dafür verantwortlich ist, aus dem DropDown-Feldwert ein Objekt zu bekommen, was wieder in die AgentConfig als OS eingetragen werden. Hier mal der Convert

/*

 * AgentConfigConverter.java

 *

 * Created on November 1, 2008, 2:14 PM

 *

 * To change this template, choose Tools | Template Manager

 * and open the template in the editor.

 */


package de.*mein_Unternehmen*.wlv.server.faces.converters;


import de.*mein_Unternehmen*.wlv.common.domain.AgentConfigOS;

import de.*mein_Unternehmen*.wlv.server.shared.JpaUtils;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.convert.Converter;

import javax.faces.convert.ConverterException;


/**

 * Converts an AgentConfigOS object to string and back

 */

public class AgentConfigOSConverter implements Converter {


    @Override

  public Object getAsObject(FacesContext facesContext, UIComponent uIComponent, String id) throws ConverterException {        

        try {

            AgentConfigOS object = (AgentConfigOS)JpaUtils.findObject(AgentConfigOS.class, Long.valueOf(id));

            return object;

            //return null;


        } catch (Exception ex) {

            return null;

        }

    }


    @Override

    public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object object) throws ConverterException {

        if (object instanceof AgentConfigOS) {

            return String.valueOf(((AgentConfigOS)object).getId());

        } else {

            return "-1";

        }

    }  

}

Der Convert muss ein korrektes Objekt von AgentConfigOS zurück liefern, was er auch tut. Keine Exception oder der gleichen. Das Objekt hat eigentlich auch die richtige Befüllung... Dennoch, scheint es bei der Validierung zu haken... Wenn ich per F7 (Netbeans) durchsteppe, lande ich direkt nach dem
return object;
beim Neuladen der Seite (was durch den Fehler verursacht wird) Es wird dann nur

form:adminOS: Validierungsfehler: Wert ist keine gültige Auswahl form:adminOS: Validierungsfehler: Wert ist keine gültige Auswahl 

ausgeben.

Weiß irgendjemand etwas dazu?

Braucht ihr noch zusätzliche Informationen?

Noch ganz kurz zu mir:

Bin 18 und Auszubildender im 2. (bald im 3.) Jahr zum Fachinformatiker.

Gelernt habe ich bis jetzt Cobol, C, C# (Berufsschule), HTML

Hatte vor diesem Projekt keinen Kontakt mit Java oder JSF.

War etwas schwer zu verstehen, da dieses Projekt ja nicht direkt "Hello World" oder der gleichen ist.

Langsam steige ich aber recht gut durch :)

  • 2 Monate später...
Geschrieben (bearbeitet)

Mhh. So wie ich das verstehe (sorry ist zwar schon ein bissel was her) befüllst du das DropDown-Menü mit einem ${AdminAgentOSBean.items} . Woher bekommt die AdminAgentOSBean die Items?

Denn das Problem ist (ich hatte mal das gleiche), wenn du sie mit Objekten füllst, musst du beim konvertieren das !gleiche! Object zurück geben. D.h. so wie mir das scheint, generierst du eher bei dem Converter ein neues AgentConfigOS-Object , welches so natürlich nicht in der ${AdminAgentOSBean.items} vorhanden ist, und daher kein gültiger Wert ist.

Was du machen könntest wäre, anstelle von itemValue="#{item}" eher eine eindeutige Eigenschaft (hier die ID) als Value nehmen und auch nur eine solche zurück bekommen(wie du es ja bei getAsString hast). Also probier mal sowas wie itemValue="#{item.id}". So wird immer noch der Name in der DropDownBox angezeigt, jedoch ist die abgefragte Id das entscheidende Kriterium und nicht das Object an sich.

Auch frage ich mich grade wie du in der Funktion :

public Object getAsObject(FacesContext facesContext, UIComponent uIComponent, String id)

an die id kommst. Woher kommt die? Wer befüllt sie und vor allem:Mit was?

Ich hoffe das konnte dir helfen.

Mfg

Chris

Bearbeitet von hbspike

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...