# SelectOneMenu mit Inhalt aus DB



## Mean (16. Dez 2008)

Hallo,

ich habe eine Bean und eine XHTML-Seite und möchte eine SelectOneMenu gerne mit Daten aus der Datenbank füllen, bekomme aber immer eine Fehlermeldung, wenn ich deployed habe und die Seite dann aufrufe.

Hier mal die Fehlermeldung (diese wird mir dann direkt im eclipseinternen Browser angezeigt):



> Exception during request processing:
> Caused by javax.servlet.ServletException with message: ""
> javax.faces.webapp.FacesServlet.service(FacesServlet.java:277)
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
> ...



Hier mal die RegisterAction.java:

```
package de.autohaus;

import static org.jboss.seam.ScopeType.EVENT;
import static org.jboss.seam.annotations.Outcome.REDISPLAY;

import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.Date;

import javax.ejb.EJB;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.ejb.Stateless;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import static javax.persistence.PersistenceContextType.EXTENDED;

import org.hibernate.validator.Valid;
import org.jboss.seam.annotations.Destroy;
// import org.jboss.seam.annotations.IfInvalid;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.ejb.SeamInterceptor;
import org.jboss.seam.log.Log;

import de.autohaus.benutzerverwaltung.Benutzerverwaltung;
import de.autohaus.benutzerverwaltung.KundeCreateAdresseException;
import de.autohaus.benutzerverwaltung.KundeDuplikatException;
import de.autohaus.benutzerverwaltung.db.Kunde;
import de.autohaus.benutzerverwaltung.db.Adresse;
import de.autohaus.benutzerverwaltung.db.Anrede;
import de.autohaus.benutzerverwaltung.db.Login;
import de.autohaus.benutzerverwaltung.db.Bank;
import de.autohaus.benutzerverwaltung.db.BankNotFoundException;
import de.autohaus.benutzerverwaltung.db.Bankverbindung;
import static de.autohaus.benutzerverwaltung.db.Kunde.FIND_KUNDEN_BY_NACHNAME;
import static de.autohaus.benutzerverwaltung.db.Kunde.PARAM_KUNDEN_NACHNAME;

@Stateful
@Scope(EVENT)
@Name("registerAction")
// TODO @Restrict("#{not identity.loggedIn}")
public class RegisterAction implements Register {
	
	@Logger
	Log log;
	
	@In
	private Anrede anrede;
	
	@In
	private Adresse adresse;

	@In
	private Bank bank;
	
	@In
	private Bankverbindung bankverbindung;
	
	@In
	private Login login;
	
	@In @Valid
	private Kunde kunde;
   
	@EJB
	private Benutzerverwaltung bv;
	
	@PersistenceContext
	private EntityManager em;
   
	@In
	private transient FacesContext facesContext;
   
	private String verify;

	public RegisterAction() {
		log.debug("IM KONSTRUKTOR");
	}

	@SuppressWarnings("unchecked")
	public List<SelectItem> listAnrede() {
		List<SelectItem> anreden = null;
		
		anreden = em.createQuery("from Anrede s").getResultList();
		
		return anreden;
	}
	

   public String register() {
	   log.info(kunde.getAdresse() + "");
	   List<Kunde> kunden = new ArrayList<Kunde>();
	   //Anrede anrede = bv.findAnredeById(Long.valueOf(1));
	   //anrede.setAnrede("Bla");
	   //log.info("BV: " + anrede);
	   bankverbindung.setBank(bank);
	   kunde.setAnrede(anrede);
	   kunde.setBankverbindung(bankverbindung);
	   kunde.setAdresse(adresse);
	   kunde.setLogin(login);
	   kunde.rolle = "kunde";
	   
	   Calendar calendar = new GregorianCalendar();
	   calendar.setTimeZone(TimeZone.getTimeZone("ECT"));
	   Date anmeldeDatum = calendar.getTime();
	   
	   kunde.setAnmeldeDatum(anmeldeDatum);
	   kunden.add(kunde);
	   
	   log.info("Kunde: " + kunde);
	   log.info("BV: " + bv);
	   
	   Collection<Kunde> tmp = null;	   
	   try {
		   tmp = bv.createKunden(kunden);	   
	   } catch(KundeDuplikatException kde) {
		   // TODO
		   System.out.println("!!! 1");
		   kde.printStackTrace();
	   } catch(KundeCreateAdresseException kcae) {
		   // TODO
		   System.out.println("!!! 2");
		   kcae.printStackTrace();
		   
	   } catch(Exception e) {
		   log.error(e.getMessage());
		   e.printStackTrace();
	   }
   }

   public String getVerify()
   {
      return verify;
   }

   public void setVerify(String verify)
   {
      this.verify = verify;
   }

   @Destroy @Remove
   public void destroy() {}
}
```

Anstelle der Methode listAnrede() habe ich auch schon eine solche in dem Bean gehabt - mit dem gleichen "Erfolg":

```
@SuppressWarnings("unchecked")
	public Collection<Anrede> listAnrede() {
		Collection<Anrede> anreden = null;
		
		anreden = bv.findAllAnreden();
		
		return anreden;
	}
```

Hier die XHTML-Seite:

```
<h:form id="register" styleClass="">

<h:selectOneMenu value="#{anrede.anrede}">
<f:selectItems value="#{registerAction.listAnrede()}" var="p" label="p.getId()" />
</h:selectOneMenu>
...
</h:form>
```

Kann mir da bitte jemand weiterhelfen? Bekomme das absolut nicht gebacken und finde auch nichts passendes (habe hier auch schon den Beitrag List<SelectMenu> durchgelesen, hat mir aber nichts gebracht ).

Vielen Dank und Grüße,

Dirk[/code][/quote]


----------



## gex (17. Dez 2008)

Hallo

Denke mal das sollte folgendermassen aussehen:

```
@SuppressWarnings("unchecked")
   public List<SelectItem> getAnreden() {
      List<SelectItem> anreden = null;
      
      anreden = em.createQuery("from Anrede s").getResultList();
      
      return anreden;
   }
```
Stichwort: Getter/Setter - JavaBeans


```
<h:form id="register" styleClass="">

<h:selectOneMenu value="#{registerAction.anrede}">
<f:selectItems value="#{registerAction.anreden}" var="p" label="p.getId()" />
</h:selectOneMenu>
...
</h:form>
```

Spontan würde ich dir dies raten.

Gruss


----------



## Mean (20. Dez 2008)

Hi gex,

danke! Da ich/wir (ist ein Studienprojekt) der Formhalber gerne unsere DAOs verwenden möchten (haben einen DAOs und NamedQueries), würde ich gerne auf die DAO über den Anwendungskern in der Benutzerverwaltung zugreifen.

Dies habe ich jetzt vorerst so gelöst:

RegisterAction.java

```
public List<Anrede> anredeSelect() {
    	ArrayList<Anrede> anreden = new ArrayList<Anrede>(bv.findAllAnreden());
    	return anreden;
    }
```

und in meiner register.xhtml dann so


```
<h:form id="register" styleClass="">
<h:selectOneMenu value="#{registerAction.anrede}">
	<s:convertEntity />
	<s:selectItems var="anrede" value="#{registerAction.anredeSelect()}" 
        label="#{anrede.anrede}" noSelectionLabel="Select Anrede..."/>
</h:selectOneMenu>
...
```

Das funktioniert auch so weit, bis ich das Formular absenden möchte, dann kommt die Meldung



> 15:38:10,066 WARN  [lifecycle] EntityManager is closed
> java.lang.IllegalStateException: EntityManager is closed
> at org.hibernate.ejb.EntityManagerImpl.getSession(EntityManagerImpl.java:66)
> at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:436)
> ...



Wenn ich dann das s:convertEntity weg lasse, dann geht es, jedoch bekomme ich dann nur einen String und kein Anrede-Objekt zurückgeliefert.

Jemand eine Idee, wie ich das beheben kann?

Meine RegisterAction.java sieht insgesamt so aus:


```
@Stateless
@Name("registerAction")
public class RegisterAction implements Register {
	
	@Logger
	Log log;

	private String anrede;
	private ArrayList<Anrede> anreden;
	
	@EJB
	private Benutzerverwaltung bv;
	
	@PersistenceContext//(type = EXTENDED)
	private EntityManager em;
   
	@In
	private transient FacesContext facesContext;
   
	private String verify;
	
	public RegisterAction() {

	}
	
    public List<Anrede> anredeSelect() {
    	ArrayList<Anrede> anreden = new ArrayList<Anrede>(bv.findAllAnreden());
    	return anreden;
    }

   public String register() {
	   log.info(anrede);
	   return "";
   }

   public void setAnrede(String a) {
	   this.anrede = a;
   }
   
   public String getAnrede() {
	   return this.anrede;
   }
   
   public String getVerify()
   {
      return verify;
   }

   public void setVerify(String verify)
   {
      this.verify = verify;
   }
}
```

Vielen Dank, Grüße und ein frohes Weihnachtsfest,

Dirk


----------

