# JSF: Entites in SelectItems und Converter



## y0dA (19. Jul 2010)

Ich entwickle nicht für Swing sondern JSF .
Ich schreibe grad einen Konverter..
Wobei so ein Konverter, bei einem grossen Objekt (=viele Member) sicher auch nicht performant sein dürfte.

Also sollte ich nie mit einem "leeren" Objekt (nur ID gesetzt) speichern sondern das Objekt bei Bedarf "nachladen"?


----------



## maki (19. Jul 2010)

> Ich entwickle nicht für Swing sondern JSF


Ach so... na dann 



> Wobei so ein Konverter, bei einem grossen Objekt (=viele Member) sicher auch nicht performant sein dürfte.


Sollte kein Problem sein, musst ja nicht alles konvertieren, nur genug um das Objekt beim zurück-konvertieren wieder zusammensetzen bzw. finden zu können, würde aber nicht den (Zurück-)Converter über JPA das Objekt suchen lassen 
Ansosnten würde es problematisch werden wenn du wirklich alles konvertieren willst, man denke nur an m:n Beziehungen :autsch:



> Also sollte ich nie mit einem "leeren" Objekt (nur ID gesetzt) speichern sondern das Objekt bei Bedarf "nachladen"?


Ja & kommt darauf an.
Man muss ja nicht immer den EntityManager bemühen, wenn man eine Referenz in einer Map oder ähnlichem ablegen kann.


----------



## y0dA (19. Jul 2010)

maki hat gesagt.:


> Ach so... na dann
> 
> 
> Sollte kein Problem sein, musst ja nicht alles konvertieren, nur genug um das Objekt beim zurück-konvertieren wieder zusammensetzen bzw. finden zu können, würde aber nicht den (Zurück-)Converter über JPA das Objekt suchen lassen
> ...



Hast du mir nicht gerade gesagt dass man das Objekt als ganzes setzen soll? Nun schreibst du man muss ja nicht alles konvertieren  - in meinem Fall handelt es sich eh um sehr kleine Objekte (2 Member). Aber grundsätzlich widersprichst du dich hier? Wie meinst du das mit dem "finden"? wie/woe kann ich die Objekte in der Session finden? Dachte ich mache mit meinem Entitymanager persists und finds und danach hab ich das Objekt und ausserhalb der Transaktion sind selbige dann eh dirty. Ich hoffe mal dass sich der OR Mapper die Dinger nicht sonst noch wo merkt - wie gesagt ich darf nicht viel Speicher benutzen 

Deinen 2ten Satz verstehe ich leider nicht so ganz. Map? Wenn ich was speichern/laden will dann muss ich das doch über den Entitymanager machen?

**EDIT**
Mein Converter ist enttäuscht  :

```
Caused by: javax.faces.convert.ConverterException
	at at.gv.brz.zwr.web.util.WaffenmarkeConverter.getAsString(WaffenmarkeConverter.java:49)
	at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:648)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.getSubmittedOrSelectedValuesAsSet(HtmlRendererUtils.java:362)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:337)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderListbox(HtmlRendererUtils.java:277)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlListboxRendererBase.encodeEnd(HtmlListboxRendererBase.java:58)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:624)
	... 42 more
```

Der Parameter "value" ist null:

```
public String getAsString(FacesContext ctx, UIComponent uiComponent,
			Object value) throws ConverterException {
		if (!(value instanceof Waffenmarke))
			throw new ConverterException();

		Waffenmarke waffenmarke = (Waffenmarke) value;
		StringBuffer sb = new StringBuffer();
		sb.append(PROP_ID);
		sb.append("=");
		sb.append(waffenmarke.getId());
		sb.append(",");
		sb.append(PROP_BEZ);
		sb.append("=");
		sb.append(waffenmarke.getBezeichnung());

		return sb.toString();
	}
```
faces:

```
<converter>
	<converter-id>waffenmarkeConverter</converter-id>
	<converter-class>at.gv.brz.zwr.web.util.WaffenmarkeConverter</converter-class>
</converter>
```

xhtml:

```
<h:outputLabel for="marke" value="#{msg.waffe_marke}" />
					<h:selectOneListbox size="1" id="marke" value="#{waffeController.waffenmarke}">
						<f:selectItems value="#{utilWebController.waffenmarkenForSelect}" />
						<f:converter converterId="waffenmarkeConverter"></f:converter>
					</h:selectOneListbox>
```

SelectItem Liste:

```
public List<SelectItem> getWaffenmarkenForSelect() {
		if (waffenmarkenForSelect == null) {
			List<Waffenmarke> waffenmarken = waffenmarkeService.loadAll();
			waffenmarkenForSelect = new ArrayList<SelectItem>(waffenmarken
					.size());

			for (Waffenmarke waffenmarke : waffenmarken) {
				waffenmarkenForSelect.add(new SelectItem(waffenmarke,
						waffenmarke.getBezeichnung()));
				// waffenmarkenForSelect.add(new
				// SelectItem(String.valueOf(waffenmarke.getId()),
				// waffenmarke.getBezeichnung()));
			}
		}

		return waffenmarkenForSelect;
	}
```


----------



## maki (19. Jul 2010)

> Hast du mir nicht gerade gesagt dass man das Objekt als ganzes setzen soll?


Bitte den Kontext berücksichtigen, JPA vs. JSF, da liegen Welten dazwischen, JSF Fragen sind zB. auch im Unterforum "Datenbankprogrammierung" eine Themaverfehlung, deine Chancen auf bessere Antworten steigen im richtigen Unterforum.

Ich hab meine Erfahrungen mit JSF 1.1 gemacht, und hab sie alle wieder verdrängt, so schrecklich war die 1.1 Version... :shock:

Nebenbei, solltest dich auf eine Sache konzentrieren, JPA und JSF gleichzeitig zu erlernen garantiert Frust, und zwar viel davon.


----------



## y0dA (19. Jul 2010)

HAHA!!!!!
Diese Kommunikation führten wir beide schon mal (bezüglich Converter):
http://www.java-forum.org/web-tier/62066-myfaces-selectitem-2.html

So wie es aussieht sollte ich mal die hashcode und equals Methode überschreiben.

Ja im angegebenen Unterforum ist noch weniger los als hier, deshalb poste ich das hier.

Und ja, JSF 1.1 war wirklich schrecklich - nun teste ich 1.2


----------



## maki (19. Jul 2010)

> HAHA!!!!!
> Diese Kommunikation führten wir beide schon mal (bezüglich Converter):
> myFaces - SelectItem


Hehe.. im März 2008 waren meine Erfahrung mit JSF noch frisch...



> So wie es aussieht sollte ich mal die hashcode und equals Methode überschreiben.


Das auf jedenfall, deswegen auch meine Frage danach in Post #6.
Tue dirselber einen gefallen und nutze nicht die ID in equals..


----------



## y0dA (19. Jul 2010)

Kannst du meinen Thread in das "richtige" Unterforum verschieben?

Du meinst ich soll die ID aus dem equals rauslassen? Dann kommts nur mehr auf "bezeichnung" an 

Argh
Also das überschreiben der beiden Methoden hat nichts gebracht - der Converter wird zuerst aufgerufen und bei "getAsString" ist der Parameter null.. Warum ist der null, habe ich hier was falsch gemacht:

```
<h:outputLabel for="marke" value="#{msg.waffe_marke}" />
					<h:selectOneListbox size="1" id="marke" value="#{waffeController.waffenmarke}">
						<f:selectItems value="#{utilWebController.waffenmarkenForSelect}" />
						<f:converter converterId="waffenmarkeConverter"></f:converter>
					</h:selectOneListbox>
```

**EDIT**
Werfe nun keine ConverterException mehr - anscheinend ist beim ersten Aufruf der Parameter immer null, danach kommen dann die korrekten Werte-warum auch immer (stand eigentlich eh auch schon in unsrem alten Thread).


----------

