Primefaces Autocomplete

freez

Top Contributor
Hallo Community,

ich habe das Pojo Sample fürs Autocomplete für meinen Anwendungsfall anpassen wollen.
PrimeFaces - ShowCase

Ich möchte in der Auswahl Länder anbieten. Ein Land hat ein "short" und ein "long" Kennzeichen (zB. DE und Deutschland). Im Textfeld des Autocomplete möchte ich nur DE stehen haben, aber zur Auswahl im Autocomplete sollen die Länder in der Form "DE Deutschland" eingeblendet werden.

Basic Pojo kommt nicht in Frage, da itemLabel scheinbar nicht mehrere EL's ala [c]#{l.short} - #{l.long}[/c] unterstützt.

Ich habe es so versucht:
[XML]<p:autoComplete value="#{bean.land}" var="l" itemValue="#{l.short}" completeMethod="#{bean.completeLand}">
<p:column><h:eek:utputText value="#{l.short} - #{l.long}"></h:eek:utputText></p:column>
</p:autoComplete>[/XML]

completeMethod liefert eine Liste mit "Ländern" zurück:
Java:
public class Laender implements Serializable {
  
    private String short;
    private String long;
//Getter Setter
}

[c]#{bean.land}[/c] ist ein String. Da soll der short Wert drin stehen.

Ich kann jetzt nun Buchstaben eingeben, das Autocomplete schlägt auch sinnvolles vor, aber sobald ich auf einen Wert klicke, wird das Textfeld leer. Anhand der Setter/Getter sehe ich,dass der Setter gar nicht aufgerufen wird. Was mache ich verkehrt?
 
Zuletzt bearbeitet:

pl4gu33

Top Contributor
alsoooo folgendes funktioniert ohne Probleme mit dem Converter. In der Auswahl steht Long + Short in dem "SelectedItem" nur der Short.

Java:
<h:outputLabel value="Select:" for="autoCom" />  
		<p:autoComplete id="autoCom" value="#{Bean.land}"
			completeMethod="#{Bean.complete}" var="l" 			
			itemLabel="#{l.shortLand}" itemValue="#{l}"
			converter="LandConverter" forceSelection="true">  
                <p:column>  
                    #{l.shortLand} - #{l.longLand}  
                </p:column>  
			</p:autoComplete>			
	</h:form>
 

pl4gu33

Top Contributor
Sry kann net mehr editieren :D

irgendwie hatte ich überlesen, dass LAND nen String sein soll in der Bean, dann kannst dir den Converter schenken:

Java:
 <h:outputLabel value="Select:" for="autoCom" />  
		<p:autoComplete id="autoCom" value="#{Bean.land}"
			completeMethod="#{Bean.complete}" var="l" 			
			itemLabel="#{l.shortLand}" itemValue="#{l.shortLand}"
			forceSelection="true">  
                <p:column>  
                    #{l.shortLand} - #{l.longLand}  
                </p:column>  
			</p:autoComplete>
 

freez

Top Contributor
Danke für die Infos. Ich habe ItemLabel weg gelassen, weil ich der Meinung war, dass ich das Label nichjt mehr benötige. Jetzt steht ein Wert im Feld, sobald ich eines auswähle.


Aber: Hast du dein Code getestet? Bei mir geht es nicht. Spätestens beim Reload der Seite fliegt ne Exception ala:
Code:
Property 'short' not found on type java.lang.String

Verstehe ich grad nicht. Scheinbar komme ich um einen Konverter nicht drum herum. Oder besteht noch Hoffnung?
Der Konverter ist an der Stelle nicht so doll. Hier kann ja der User angeben, was er will und wie soll ich da eine saubere Konvertierung durchführen, wenn der User "blabl%T~`´T%a" eingibt.
 
Zuletzt bearbeitet:

pl4gu33

Top Contributor
naja short als Variablennamen kannst du natürlich nicht nehmen :D das is ein Datentyp :D ich dachte, das war nur als Beispiel gedacht :) ... bei mir läuft es einwandfrei, .... solang du nur einen String der Bean zuweist, geht das alles ohne Converter :)

ps. wenns immer noch net klappt, kann ich dir später gern mal meinen Code posten
 
Zuletzt bearbeitet:

freez

Top Contributor
naja short als Variablennamen kannst du natürlich nicht nehmen :D das is ein Datentyp :D ich dachte, das war nur als Beispiel gedacht :)

der Variablenname ist natürlich ein Beispiel. Ich habe das Ganze vereinfacht.

hast du auch mal versucht den Reload Button deines Browser zu drücken, nachdem die Daten im Bean gelandet sind? Bei mir kommt dann die Fehlermeldung, welche ich oben gepostet habe. Wenn das bei dir geht, wäre dein Code schon interessant.
 
Zuletzt bearbeitet:
P

pL4Gu333

Gast
kann ich zuhause nochmal probieren, werde das heute abend dann posten. Auf welchem Scope hast du denn die Bean?
 
P

pL4Gu333

Gast
Der String wird aber zugewiesen per Setter, ja? Das tritt nur auf, wenn du dann Refresht ?
Wie gesagt wenn ich heute abend zuhause bin schau ich mal
 

freez

Top Contributor
Ja, wenn ich Deutschland auswähle landet "DE" drin.

Vermutung: Beim Refresh erwartet er eine Klasse mit "short" als Member, weil er über ItemValue und ItemLabel wohl diese Info benötigt
Code:
itemLabel="#{l.short}"
Code:
itemValue="#{l.short}"
. Da er aber einen String bekommt fehlt im diese Info. Ich verstehe nicht, wieso er das beim Refresh benötigt, aber ich vermute hier ziehen die Mechanismen von einem SelectOneMenu (wegen ähnlicher Deklaration) und dieses würde ja ein ordentliches Objekt mit
Code:
short
Member erwarten, damit das richtige Item vorgeblendet wird.
 

pl4gu33

Top Contributor
hey ich fass mich mal kurz hab gerade net viel Zeit.... morgen mehr :D .... aber ich hab das gleiche Verhalten nach dem Refresh wie du.... werde morgen abend mal ein wenig rumschauen und mich damit etwas mehr beschäftigen, falls du nicht schon eine Lösung gefunden hast :)
 

freez

Top Contributor
Vielen Dank für deine Mühe. Mit nem Konverter klappt das Ganze (so wie im Primefaces Beispiel). Ist net schön, wenn man sich überlegt, dass man nur Strings umeinanderschubst. Ohne Autocomplete (also nur InputText) hätte ich den String direkt im Objekt abgelegt, welches ich persistiere. So benötige ich nun extra Objekte, die ich händeln muss und das Ganze auch etwas komplizierter macht. Der Konverter ist ansich recht einfach aufgebaut, da ich eh nur einen Member im Objekt ablegen muss zum persistieren.

Also wenn du Lust und Laune hast eine einfachere Lösung zu finden, dann gern. Vielleicht habe ich ja noch einen Denkfehler. Ich habe es jedenfalls aufgegeben, auch wenn es mich ärgert, dass ich es umständlicher machen muss.
 
Zuletzt bearbeitet:

Nogothrim

Aktives Mitglied
Das ist schon richtig so, dass dein Vorhaben nur mit Converter funzt. Es muss ja in beide Richtungen konvertiert werden können, auch wenn es nur Strings sind.
 

Ähnliche Java Themen

Neue Themen


Oben