# EJB aus JSF Anwendung aufrufen



## inv_zim (10. Jul 2012)

Hallo,

ich habe ein Problem, welches wahrscheinlich einfach ein Denkfehler ist, aber ich blicke so langsam selbst nicht mehr so durch was ich da tue, vielleicht sieht ja jemand von euch etwas?

Ich möchte eine EJB aus einer JSF Anwendung heraus aufrufen. Eigentlich eine simple Sache. Die Anwendung ist in einem EAR gepackt und enthält mehrere WAR und EJB Module. Das Projekt wird mit Maven realisiert. Mein Setup:

Business-Interface:

```
public interface PropertyFacade {
    
    public Property fetchForPropertyKey(String artikelNummerKurz);

    public void create(Property entity);

    public void edit(Property entity);

    public void remove(Property entity);

    public Property find(Object id);

    public List<Property> findAll();

    public List<Property> findRange(int[] range);

    public int count();
}
```

EJB:

```
@Stateless
@Local
public class PropertyFacadeBean extends AbstractFacade<Property> implements PropertyFacade {

    @PersistenceContext(unitName = "mssqlPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public PropertyFacadeBean() {
        super(Property.class);
    }

    @Override
    public Property fetchForPropertyKey(String propertyKey) {
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<Property> cq = cb.createQuery(Property.class);
        Root<Property> sendung = cq.from(Property.class);

        Predicate property = cb.equal(sendung.get(Property_.propertyKey), propertyKey);

        cq.select(sendung).where(cb.equal(property, propertyKey));

        return getEntityManager().createQuery(cq).getSingleResult();
    }
}
```

JSF Backing Bean (in einem WAR):

```
@Named
@RequestScoped
public class PropertyBean implements Serializable {

    @EJB
    private PropertyFacade propertyFacade;

    public List<Property> fetchAll() {
        return propertyFacade.findAll();
    }

    public void create(Property property) {
        propertyFacade.create(property);
    }

    public void remove(Property property) {
        propertyFacade.remove(property);
    }

    public void edit(Property property) {
        propertyFacade.edit(property);
    }
}
```

Sobald ich diese Konfiguration in einem EAR gepackt auf einem Glassfish 3.1 deploye, bekomme ich die Fehlermeldung:



```
Schwerwiegend: Exception while deploying the app [de.ursachemie_Ursa-ear_ear_1.0-SNAPSHOT] : Cannot resolve reference Remote ejb-ref name=de.ursachemie.kennzeichnung.web.jsf.PropertyBean/propertyFacade,Remote 3.x interface =de.ursachemie.kennzeichnung.business.bean.facades.PropertyFacade,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session because there are 7 ejbs in the application with interface de.ursachemie.kennzeichnung.business.bean.facades.PropertyFacade.
```

Die Fehlermeldung ist ja eigentlich eindeutig: In meinem EAR gibt es 7 Implementierungen von PropertyFacade. Das stimmt aber leider nicht. Alle Abhängigkeiten zum EJB Modul sind in den Maven POMs mit "provided" markiert damit es nicht erneut kopiert wird, das EJB Modul dürfte demnach auch nur einmal existieren und nicht 7(!) mal. Ich habe die Art, auf die EJB zuzugreifen mit "The Java EE 6 Tutorial" abgeglichen und seit gestern mehrere Artikel und Problemlösungen im Web nachgeschlagen (CodeRanch, Stackoverflow) und wenn ich nicht allzu betriebsblind geworden bin, müsste das doch der richtige Weg sein, oder?

Danke schonmal fürs Lesen und Gruß,

Tim

Edit: Ich bin zusätzlich noch über die Aussage gestolpert, dass @Inject gegenüber @EJB vorzuziehen ist. Davon abgesehen, dass in der Anwendung ja trotzdem ein Problem zu bestehen scheint, funktioniert das Deployment, wenn ich @Inject statt @EJB benutze. Der injizierte Entitymanager ist dann aber null. Ich glaube, ich werde Landschaftsgärtner....


----------



## tagedieb (10. Jul 2012)

Funktioniert die Anwendung wenn du sie aus der Entwicklungsumgebung (Eclipse/NetBeans) startest?

Wenn ja, scheint es am EAR zu liegen und Maven hat ev. zuviel oder zuwenig reingepackt.
Zeig mal das Ear welches Maven erstellt.


----------



## inv_zim (10. Jul 2012)

Hi tagedieb,

Vielen, vielen Dank für die Idee noch einmal genauer ins EAR zu schauen! Das betreffende EJB Modul war im lib Ordner abgelegt, da ich in der POM des EAR bei der Dependency den Tag 
	
	
	
	





```
<type>ejb</type>
```
 nicht drin hatte. Habe die Abhängigkeit wohl über die IDE hinzugefügt und die hat es als Jar angesehen. 

Danke und schönen Tag noch,

Tim


----------

