Přeskočit na hlavní obsah

Seam - tipy a triky (EJB)

Seam je dobře použitelný s EJB, kde jsou jednotlivé EJB vystaveny jako Seam komponenty a navíc obsahují všechny služby, které EJB kontejner nabízí.

Jsou ovšem chvíle, kdy bych potřeboval obyčejnou Seam komponentu a do ní nějakým způsobem vstříknout EJB beanu. Co se týče implementaci pro glassfish, není situace tak jednoduchá, jak by se mohlo zdát.

Takže, mějme příklad, kdy potřebuji vytvořit Seam komponentu, která bude míti jednu metodu, která bude vracet seznam hodnot z nějaké entity.

Klasický přístup by mohl vypadat následovně:
@Name("testList")
public class TestList {
  @Unwrap
  public List<Entita> lookup() {
  return entityManager.createQuery("from Entita e").getResultList();
  }
}

Použití ve facelets stránce by poté vypadalo následovně:

 

Pravdou je, že použití samotné anotace @Unwrap může mít hezké uplatnění.

Jenže, osobně se mi nelibí možnost, že musím uvnitř samotného "testListu" volat entity manager a navíc psát nějaké OQL. Mám již definovanou DAO vrstvu pomocí EJB a chci lookupnout samotnou EJB jako Seam komponentu.

K tomtuto účelu jsem si vytvořil jednoduchou lookup službu, která vypadá následnovně:
@Stateless
@Name("lookup")
@Scope(ScopeType.APPLICATION)
@Interceptors(value = {SeamInterceptor.class})
public class LookupBean implements LookupLocal {

@Resource
private EJBContext context;

@EJB
  private SessionLookupLocal sess;

public Object ejb(String bean) {
  return context.lookup(bean);
  }

public EntityManager getEntityManager() {
  return sess.getEntityManager();
  }

public Session getSession() {
  return sess.getSession();
  }

}

Takže lookup služba slouží k získaní jak EJB beany tak entity manageru popřípadě Hibernate Session. Dá se sice namítnout, že Seam umí přímo injectnout EntityManager (dokonce se to dá hackem zprovoznit i v glassfish), ale já si raději vsrtvy odděluji, proto injectuji daný "persistence provider" jen v nejnutnějších chvílích. Druhou věcí je fakt, že daný provider pro persistenci přenáší jiná EJB beana. Důvodem je fakt, že při inicializaci a vytvoření Seam komponenty ještě není znám provider pro entity manager, proto ho musím získat z jiné EJB.

Ale zpět. K tomu, aby daná lookup služba (která je jak Seam komponentou tak EJB komponentou) byla schopná lookupovat EJB, musí být navíc definovana reference na dané EJB beany v ejb.jar.xml, nebo pomocí anotací. Já jsem zde raději přistoupil k možnosti pomocí XML, jelikož se jedná o speciální požadavek, který se v průběhu života může změnit.
    
 
  LookupBean
  cz.irminsul.seam.app.LookupBean
 
  NejakaDAOBean
  cz.irminsul.NejakaDAOLocal
  NejakaDAOBean
 

 

 

Díky této definici reference mám možnost uvnitř lookupBean získávat ejb dynamicky, tedy přes initialContext.

Konečné použití uvnitř Seam komponenty, která není EJB beanou, může vypadat následovně:
@Name("testList")
public class TestList {

@In(value = "#{lookup.ejb('NejakaBean')}")
  private NejakaLocal bean;

private List<Entita> data;

@Unwrap
  public List<Entita> lookup() {
  if (data == null) {
  data = bean.metodaLokalnihoInterface();
  }
  return data;
  }

}

Samozřejmě je možné získat i Entity Manager či Hibernate Session. Použití je v podstatě jasné:
@In("#{lookup.entityMananger}")
private EntityManager em;

Daný návod je funkční v Seam 2.0, EJB 3 a Glassfish V2.

Komentáře

  1. Proc nepouzijes seamovskou konponentu org.jboss.seam.Component:

    JinaKomponenta jc = Component.getInstance("jmeno_jine_komponenty");

    OdpovědětVymazat
  2. To je samozrejme pravda, ale tyka se Seam komponenty. Me slo o pravy opak. Tedy do Seam komponenty dostal EJB komponentu, ktera o Seamu nic nevi.

    OdpovědětVymazat
  3. Ja tedy o Seamu taky nic nevim, ale chtela jsem se poucit. Neni mi jasne to vstrikovani, slo by to k necemu pribodobnit? Lze si to predstavit jako vstrikovani fazoli do ostrikovace, napr. u Ford Escort? A jak se zachovat v pripade praskle hadicky? Dekuji za odpoved

    OdpovědětVymazat

Okomentovat

Populární příspěvky z tohoto blogu

Jak si v IT vydělat hodně peněz?

Na začátek by bylo dobré, abych objasnil samotný titulek, který může na někoho působit jako červený hadr. Článek nebude o obecných pravidlech, ale bude vyprávět můj vlastní příběh, na kterém vám zkusím ukázat, jak se dá docílit úspěchu, či alespoň správně nastartovat svojí vlastní kariéru v IT.

I když se z názvu článku dá dedukovat, že se vše bude točit kolem peněz, není tomu tak. Alespoň ze dvou třetin určitě ne. Ale to už předbíhám, pojďme to raději vzít hezky popořadě...

Kdybychom měli mluvit o roce 2017 jako o přelomové době, nejspíše to nebude pravda. I když pro někoho to může být rok plný úspěchů a štěstí v podobě narození zdravých dětí, svatby či první velké lásky, tak z pohledu lidstva se jedná o rok, který jen kopíruje předešlé a v oblasti technologií nás posouvá stejným tempem jako rok předtím.

Jsem naprosto přesvědčen o tom, že i když se současná doba tak nenazývá, tak prožíváme dobu, která jednou bude označena za revoluční, a to zejména díky vynálezu internetu, který je st…

Jak by se firmy neměly chovat k programátorům?

Každý, kdo pracuje v IT oboru, se jistě již setkal s různými „geniálními nápady“, od kterých si firma slibovala zlepšení produktivity či snížení nákladů. Ať už je to zavedení agilních principů, striktní kontrola práce či zavedení nové a skvělé metodiky, o které si „šéf“ přečetl včera na internetu. Jsou z toho skutečně tak nadšení i samotní vývojáři? A bude nový nápad fungovat?
K napsání tohoto článku mě navedly různé programátorské diskuze, kde si lidé stěžovali na firmu, kde pracují. Příklady, které zde uvedu, jsou z reálné praxe. Ať už jsem je zažil jako řadový programátor, či jako šéf týmu.
I když je poptávka po programátorech tak vysoká, že Vás headhunteři nahánějí i ve chvílích, kdy o to opravdu nestojíte, tak i přes to je mnoho lidí, kteří se bojí opustit svoje současné zaměstnání.
Čeho se nejčastěji bojíme? Je to samozřejmě nejistota, kterou si často omlouváme větami jako: „Tady mám své pohodlí, co když to jinde mít nebudu?“ nebo „I když mě to v práci štve a nebaví, tak mě ale…

Jak jsem technologicky postavil startup

Tento příběh pojednává o technologiích, nástrojích a vůbec o všem, co jsem potřeboval k tomu, abych byl schopen, postavit startup na zelené louce.

Každý správný příběh začíná stejně: "Jednou jsem...."

Kapitola první: Nápad
Jednou jsem se setkal s člověkem, který měl nápad na produkt, který se v průmyslu zatím nevyskytuje. I přes prvotní skepsi, kdy jsem si říkal: "Tohle už přeci dávno v průmyslu existuje, ne?", jsem došel ke zjištění, že nikoli.

Tím jsem se dostal ke svému prvnímu poučení. Průmysl je technologicky dost zabržděný. Osobně se domnívám, že těch důvodů, proč tomu tak je, je několik. Za prvé je to fakt, že většina lidí, kteří se pohybují v tomto odvětví jsou často konzervativní a za správné považují pouze léty osvědčené věci. Druhým důvodem je to, že jakákoli změna znamená riziko. Ať už z pohledu finanční ztráty tak i z pohledu stability výroby. No a třetím a nejzásadnějším důvodem je to, že ač zde máme spousty technologických vymožeností, narážíme na to,…