JSF selectOneMenu keine Auswahl

Crusher55

Mitglied
hallo,

Bin im bereich JSF noch ein purer Anfänger und schreibe nun meine erste Anwendung, ein Warenwirtschaftssystem. Habe folgendes Problem und hoffe das ihr mir helfen könnt bin am verzweifeln.

Ich habe ein SelectOneMenu mit dem ich meine Marke auswählen will, doch bekomme die nicht angezeigt.

WWS.java
Java:
package controller;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import model.Artikel;
import model.Flaschenart;
import model.Volumen;

@ManagedBean(name = "mbWWS")
@SessionScoped

public class WWS {

	public WWS(){}

	private DataModel<Artikel> wws = new ListDataModel<Artikel>();
	
	@PersistenceContext
	private EntityManager em;

	@Resource
	private UserTransaction utx;
	
	private Artikel merkeArtikel = new Artikel();

	public void init() {
	try {
	utx.begin();
	em.persist(new Artikel("hugo", Volumen.Large, 15,20, Flaschenart.Glas, 6,15,15,15));
	em.persist(new Artikel("hans", Volumen.Large, 15,20, Flaschenart.Glas, 5,15,15,15));
		wws.setWrappedData(em.createNamedQuery("SelectWWS").getResultList());
		utx.commit();
	} catch (Exception e) {
			e.printStackTrace();
}	
	}
	public Artikel getMerkeArtikel() {
		return merkeArtikel;
	}
	
	public void setMerkeArtikel(Artikel merkeArtikel) {
		this.merkeArtikel = merkeArtikel;
	}
	
	public DataModel<Artikel> getWws() {
		return wws;
	}

	public void setWws(DataModel<Artikel> wws) {
		this.wws = wws;
	}
}

Artikel.java
Java:
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@NamedQuery(name="SelectWWS", query="Select a from Artikel a")
@Entity

public class Artikel {
	
	private static final long serialVersionUID = 2615809714551834760L;
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	@Size(min=1, max=30)
	String marke;
	@Enumerated
	Volumen volumen;
	@NotNull
	int anzKi;
	@NotNull
	int anzFl;
	@Enumerated
	Flaschenart flaschenart;
	@NotNull
	double steuersatz;
	@NotNull
	double gewinn;
	@NotNull
	double einkaufspreis;
	@NotNull
	double verkaufspreis;
	String Fehler;
	
	public Artikel(){
		
	}
	
	public Artikel(String marke,Volumen volumen,int anzKi,int anzFl,Flaschenart flaschenart,double steuersatz,double gewinn,double einkaufspreis,double verkaufspreis){
		super();
		this.marke = marke;
		this.volumen = volumen;
		this.anzKi = anzKi;
		this.anzFl = anzFl;
		this.flaschenart = flaschenart;
		this.steuersatz = steuersatz;
		this.gewinn = gewinn;	
		this.einkaufspreis = einkaufspreis;
		this.verkaufspreis = verkaufspreis;
	
	}
//Getter und Setter
}

Bestand.xhtml

<h:eek:utputLabel for="marke" value="Marke: " />
<p:selectOneMenu id="marke" value="#{mbWWS.merkeArtikel.id}" >
<f:selectItems value="#{mbWWS.merkeArtikel}" label="{mbWWS.merkeArtikel.marke}"/>

</p:selectOneMenu>

Danke
 
F

fisherman

Gast
<f:selectItems value="#{mbWWS.merkeArtikel}" label="{mbWWS.merkeArtikel.marke}"/>

Das <f:selectItems>-Tag erwartet eine Collection für das Attribut value, du übergibst aber ein Artikel-Objekt. Wenn du das Label aus der Liste geliefert bekommen möchtest, benötigt das Tag das Attribut var, das ein Element aus der Liste repräsentiert. Das Attribut itemLabel kann dann das einzelne Element ansprechen, das Tag kennt kein Attribut label. Beispiel:
HTML:
<f:selectItems value="#{mbWWS.wws}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}" />
 

Crusher55

Mitglied
Danke für die Schnelle Antwort, doch es funktioniert immer noch nicht.
Habe es genauso umgesetzt wie du es beschrieben hast.

HTML:
    	<h:outputLabel for="marke" value="Marke: " />
		<p:selectOneMenu id="marke" value="#{mbWWS.wws}" >
		<f:selectItems value="#{mbWWS.wws}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}" />

		</p:selectOneMenu>
 
F

fisherman

Gast
Habe es genauso umgesetzt wie du es beschrieben hast.
Nein. Du hast dem Tag <p:selectOneMenu> nun auch die Liste übergeben. Mit einer Collection kann dieses Tag aber nichts Sinnvolles anfangen, sondern bestenfalls mit einem Element aus einer Collection. Deine erste Implementierung dieses Tags hat doch gestimmt: Die Id von merkeArtikel aus dem Bean holen.
Schau dir mal die Showcases von PrimeFaces näher an.
 

Crusher55

Mitglied
Habe es auch nach deiner Variante versucht, doch leider kein Erfolg.

HTML:
<h:outputLabel for="marke" value="Marke: " />
		<p:selectOneMenu id="marke" value="#{mbWWS.merkeArtikel.id}" >
		<f:selectItems value="#{mbWWS.wws}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}" />

		</p:selectOneMenu>

Habe mir auch nochmal die Seite angeguckt, aber leider hat mir die Seite auch nicht weitergeholfen.
Kann das daran liegen das ich nicht mit Klassischen Listen arbeite sondern mit ListDataModel?
 
F

fisherman

Gast
Kann das daran liegen das ich nicht mit Klassischen Listen arbeite sondern mit ListDataModel?
Ja. <f:selectItems> erwartet eine Collection oder ein Array. Die Klasse DataModel implementiert aber nicht das Interface Collection. DataModel ist eine Wrapper-Klasse, über die Methode getWrappedData() solltest du Zugriff auf die Liste haben. Allerdings gibt die Methode den Typ Object zurück, d.h. du musst ggf. casten.
Alles etwas umständlich allerdings, verwende besser eine ArrayList.

Schau mal in die entsprechenden Dokumentationen rein, da wird das Ganze deutlicher:
 

Crusher55

Mitglied
Danke dir werde das mal so ausprobieren und im schlimmsten fall alles auf listen umschreiben.
Aber was meinst du mit casten und wenn ich doch weiter mit datamodel arbeiten will, würde es mit einem Converter funktionieren?
 
F

fisherman

Gast
im schlimmsten fall alles auf listen umschreiben.
Genau genommen ist das der beste Fall. In Beans verwendet man typischerweise Listen oder Arrays für diese Tags.
Aber was meinst du mit casten und wenn ich doch weiter mit datamodel arbeiten will, würde es mit einem Converter funktionieren?
DataModel ist, wie gesagt, eine Wrapper-Klasse, d.h. sie beinhaltet/kapselt ein Objekt beliebigen Typs. In deinem Fall ist das eine Liste, die du per setWrappedData() übergeben hast. Die kannst du aus dem Wrapper-Objekt wws, wie beschrieben, auch wieder herausholen. Über getWrappedData() kommt sie aber als Typ Object zurück, nicht als Listentyp (siehe Dokumentation zur Klasse).
Ein Converter ist hier nicht das Mittel der Wahl, weil du nichts konvertieren musst, die Liste ist ja schon da, nur eben im Wrapper verpackt. Wenn du den Wrapper behalten willst, kannst du auch eine Methode in das Bean einführen, die dir die Liste aus dem Wrapper holt und sie dem Tag ausliefert. In etwa so:
Java:
public List<Artikel> getArtikelListFromWrapper() {
   final ArrayList<Artikel> artikelList = (ArrayList<Artikel>) this.wws.getWrappedData();
   return artikelList; 
}
HTML:
<f:selectItems value="#{mbWWS.artikelListFromWrapper}" ... />

Mir sind noch ein paar Sachen aufgefallen in deinem Code:

  • Den Konstruktor public WWS(){} brauchst du nicht. Solange du keinen anderen Konstruktur in einer Klasse hast, erzeugt der Compiler automatisch einen noarg-Konstruktor.
  • Den Aufruf super(); brauchst du auch nicht. Baut der Compiler auch automatisch ein.
  • Die Transaktion in der init()Methode solltest du überprüfen. Für INSERT und SELECT-Operationen benötigst du jeweils eigene Transaktionen. Ein INSERT des EntityManager wird erst persistiert, wenn du commit() aufgerufen hast. D.h. in deinem Code willst du Zeilen aus der Tabelle holen, die anfänglich gar nicht existieren, da sie noch nicht persistiert sind.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben