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:
EJB:
JSF Backing Bean (in einem WAR):
Sobald ich diese Konfiguration in einem EAR gepackt auf einem Glassfish 3.1 deploye, bekomme ich die Fehlermeldung:
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....
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:
Java:
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:
Java:
@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):
Java:
@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:
Code:
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....
Zuletzt bearbeitet: