Situacija je sledeća:
- Web aplikacija koja je deploy-ovana na Glassfish(3.1 čini mi se)
-EAR aplikacija koja je isto deploy-ovana na tom serveru
EAR fajl u suštini u sebi sadrži samo jedan EJB modul, sa EJB-om, njegovim Local interfejsom i jednom klasom Users, koja se preslikava u MySQL entitet.
EJB remote interfejs razvijam u zasebnom projektu, kako bi mogao samo da uključim njega u biblioteku web aplikacije, a onda preko JNDI-a da pronađem EJB i pozovem metodu koja mi treba...
Obe aplikacije deploy-ujem i pokrećem direktno iz NetBeans-a 6.9.1. MySQL 5.5.12 (Community Edition) pokrećem zasebno.
E sad, sve radi kako treba, web aplikacija na odredjenoj stranici nadje EJB, on preko EntityManagera pristupi bazi, izvrši upit i vrati HashMap<String,String>, što i treba da vrati. Samo ne znam zašto se pretraga EJB-a i poziv njegove metode dešavaju DVA PUTA? Sad ću da postavim relevantne delove koda, pa ako neko može da mi objasni, ima virtuelno pivce od mene

BeanOneRemote : (EAR)
@Remote
public interface BeanOneRemote {
public HashMap<String,String> returnDomainObjects();
}
BeanOne : (EAR)
@Stateless
public class BeanOne implements BeanOneRemote, BeanOneLocal {
@PersistenceContext(unitName = "jsf-demoEJBPU")
private EntityManager em;
...
@Override
public HashMap<String,String> returnDomainObjects() {
HashMap<String,String> hashMap = new HashMap<String,String>();
try{
Query q = em.createNamedQuery("Users.findByUserId");
q.setParameter("userId", 1);
Users u = (Users) q.getSingleResult();
hashMap = u.returnAttributeValues();
}
catch(Exception e){
System.out.println(e.getMessage());
}
return hashMap;
}
FindUserBean : (WEB)
@ViewScoped
@Named
public class FindUserBean{
private BeanOneRemote bean;
...
public void setBean() {
this.bean = lookupBeanOneRemote();//Postavlja bean nakon konstrukcije
}
@PostConstruct
private void init(){
setBean();
}
public String getObjekti(){
String odg =null;
try{
HashMap<String,String> niz =bean.returnDomainObjects();
if(niz!=null){
System.out.println(niz.get("userId")+" - "+niz.get("userUsername")+" - "+niz.get("userPassword")+" - "+niz.get("userMail"));
odg = "truc";
}
}
catch(Exception e) {
System.out.println(e.getMessage());
odg= "bla";
}
return odg;
}
...
private BeanOneRemote lookupBeanOneRemote() {
if(bean==null){ //Ovo mozda ni ne treba, al sam stavio aj za svaki slucaj...
try {
Context c = new InitialContext();
Properties p = new Properties();
p.put("java.naming.factory.initial", "com.sun.enterprise.naming.impl.SerialInitContextFactory");
p.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming.impl");
System.out.println("properties se puni vrednostima...");
p.put("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
c = new InitialContext(p);
System.out.println("Pre trazenja ejb-a");
BeanOneRemote b = (BeanOneRemote) c.lookup("java:global/E-Learning/jsf-demoEJB/BeanOne!prvi.BeanOneRemote");
System.out.println("Nadjen EJB - "+b.toString());
return b;
} catch (NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
throw new RuntimeException(ne);
}
}
else return bean;
}
i na kraju
stuff.xhtml :
<ui:composition
template="template.xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="skripte">
</ui:define>
<ui:define name="mainbar">
<div class="article">
<h:outputText value="#{findUserBean.objekti}"/><!-- ovo je neki string koji dobijam preko metode getObjekti, a u kojoj radim System.out.println()-ove, da bi znao šta je vraćeno od beana -->
</div>
</ui:define>
</ui:composition>
A ovo izbacuju System.out.println()-ovi:
INFO: properties se puni vrednostima...
INFO: Pre trazenja ejb-a
INFO: Nadjen EJB - prvi._BeanOneRemote_Wrapper@1305ee63
INFO: 2 - Axl - Rose - [email protected]
INFO: properties se puni vrednostima...
INFO: Pre trazenja ejb-a
INFO: Nadjen EJB - prvi._BeanOneRemote_Wrapper@1305ee63
INFO: 2 - Axl - Rose - [email protected]
Znaci u suštini radi sve kako treba što se tiče povezivanja web aplikacije sa EJB modulom, i njega sa bazom, samo ako neko može da mi kaže zašto se lookupBeanRemote() i
getObjekti() pozivaju dva puta?