Mixermachine Geschrieben 23. Juli 2012 Geschrieben 23. Juli 2012 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 Zitieren
Mixermachine Geschrieben 26. Juli 2012 Autor Geschrieben 26. Juli 2012 Das Problem ist wirklich komisch... Mittlerweile waren schon 4 Kollegen bei mir, die gesagt haben, das es eigentlich so funktionieren sollte Hat niemand eine Idee? Zitieren
hbspike Geschrieben 6. Oktober 2012 Geschrieben 6. Oktober 2012 (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 6. Oktober 2012 von hbspike Zitieren
Empfohlene Beiträge
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.