# Kleinere Frage EJB/JSF



## corofighter (27. Jun 2010)

Hallo,

folgendes: Mein xhtml sieht wie folgt aus:

```
<h:selectOneMenu id="adresse" value="#{nutzerController.selected.adresse}" title="#{bundle.CreateNutzerTitle_adresse}" required="true" requiredMessage="#{bundle.CreateNutzerRequiredMessage_adresse}">
                        <f:selectItems value="#{adresseController.itemsAvailableSelectOne}"/>
                    </h:selectOneMenu>
```

Folgendes Bean funktioniert:

```
public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems((List<Adresse> ejbFacade.findAll(), true);
    }
```

aber bei folendem kriegt ich eine Fehlermeldung

```
public SelectItem[] getItemsAvailableSelectOne() {
        javax.persistence.Query q=this.ejbFacade.getEntityManager().createQuery("select object(o) from Adresse o");
        return JsfUtil.getSelectItems((List<Adresse>) q.getResultList(),true);
    }
```

javax.ejb.EJBException: Illegal non-business method access on no-interface view

Die Codes wurde mit dem Wizard von NB6.9/JSF 2.0 erstellt.

Kann mir jmd. helfen? Danke!


----------



## nocturne (27. Jun 2010)

in welcher zeile denn?


----------



## corofighter (28. Jun 2010)

Danke, ist Zeile 2


----------



## maki (28. Jun 2010)

Das Problem (bzw. mehrere):

```
this.ejbFacade.getEntityManager().createQuery(....
```
Sowas macht man doch nicht in einer JSF ManagedBean vom ServletContainer aus, abgesehen davon ist das ein sog. "Trainwreck" und durchbricht dazu noch die Schichtentrennung.


----------



## corofighter (28. Jun 2010)

Danke. Ich will ja gar nicht verhehlen, dass ich noch recht unerfahren mit JSF bin. Wie macht man es denn ansonsten? Netbeans bietet mir als Methoden von ejbFacade nur findAll() und findRange (und eben getEntityManager) an. Wie werden denn parametrisierte Queries denn normalerweise durchgeführt?

Danke im Voraus!


----------



## maki (28. Jun 2010)

> Netbeans bietet mir als Methoden von ejbFacade nur findAll() und findRange (und eben getEntityManager) an


Dann solltest du da welche hinzufügen 



> Wie werden denn parametrisierte Queries denn normalerweise durchgeführt?


Ausschliesslich von der EJB.


----------



## corofighter (28. Jun 2010)

Danke. Ich weiß zwar nicht, ob es guter Stil ist, aber ich habe es so gemacht:

In die AdresseFacade.java folgende Code eingefügt

```
public List<Adresse> findAllAdresse(){
        Query q=  this.getEntityManager().createNamedQuery("Adresse.findAll");
        return (List<Adresse>) q.getResultList();
    }
```

und dann kann man es von JSF ManagedBean AdresseController über  
	
	
	
	





```
return JsfUtil.getSelectItems(ejbFacade.findAllAdresse(), true);
```
 aufrufen.

Läuft jedenfalls.


----------



## maki (28. Jun 2010)

Japp, so sollte das sein.

ManagedBean -> EJB -> EntityManager


----------

