Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

JSF Problem mit Convert und Validation

Empfohlene Antworten

Veröffentlicht

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...

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.