# Primefaces Autocomplete



## freez (7. Dez 2012)

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><hutputText value="#{l.short} - #{l.long}"></hutputText></p:column>
</p:autoComplete>[/XML]

completeMethod liefert eine Liste mit "Ländern" zurück:

```
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?


----------



## pl4gu33 (8. Dez 2012)

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


```
<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 (8. Dez 2012)

Sry kann net mehr editieren  

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


```
<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 (9. Dez 2012)

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: 

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


----------



## pl4gu33 (10. Dez 2012)

naja short als Variablennamen kannst du natürlich nicht nehmen  das is ein Datentyp  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


----------



## freez (10. Dez 2012)

pl4gu33 hat gesagt.:


> naja short als Variablennamen kannst du natürlich nicht nehmen  das is ein Datentyp  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.


----------



## pL4Gu333 (10. Dez 2012)

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


----------



## freez (10. Dez 2012)

pL4Gu333 hat gesagt.:


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



Session Scope

Danke


----------



## pL4Gu333 (10. Dez 2012)

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 (10. Dez 2012)

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 
	
	
	
	





```
itemLabel="#{l.short}"
```


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





```
short
```
 Member erwarten, damit das richtige Item vorgeblendet wird.


----------



## pl4gu33 (10. Dez 2012)

hey ich fass mich mal kurz hab gerade net viel Zeit.... morgen mehr  .... 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 (10. Dez 2012)

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.


----------



## Nogothrim (11. Dez 2012)

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.


----------

