Blog
Skip to end of metadata
Go to start of metadata

Tegnap este jó pár órát töltöttem azzal a tevékenységgel, amelyekkel a kezdő (és sokszor a haladó) fejlesztő nem számol, amikor egy feladatra becslést ad: rejtélyes hibának az okát keresi.

Nem kell komoly dologra gondolni, egyszerűen elő fogok adni egy Java konferencián Android és JavaEE: légy REST! témában, ezért szokásomhoz híven viszonylag korán nekiálltam az előadás anyagát elkészíteni. A peremfeltételek egyszerűek voltak: egy WAR projekt, egy REST interfész, egy EJB(Lite) és persze egy JPA. Triviális dolog, a Java osztályok alig egy tucat sorosak, rajtuk kívül pedig csak egy persistence.xml létrehozásából állt a feladat. A pár perc alatt (tényleg!) elkészíthető demó alkalmazás azonban nem akart jól működni, a percekből negyed órák lettek, a negyed órákból órák és nagyjából fél nap után rájöttem, hogy mi okozta a fura jelenséget.

Mi is volt a fura jelenség? Egyszerűen az EntityManager példány nem akart értéket kapni, akárhogy annotáltam, akárhogy hoztam létre az osztályt, tettem bele bármit, annotáltam akárhogy... nem és nem, pedig a lehető legegyszerűbb EJB osztályra kell gondolni:

@Stateless
public class TokenService {
    @PersistenceContext
    private EntityManager em;

    public final String validate(final String token) {
        System.out.println(em);
    }
}

A WildFly szó nélkül telepítette, elindította, a Hibernate szépen felismerte az entitásokat, létrehozta a sémát, elindult minden, lett JNDI bejegyzés, lett REST interfész is (másik osztályból), csak éppen az em értéke null maradt, hiba sehol, naplófájlokban semmi nyom (na jó, TRACE szintet nem kapcsoltam be). Az alábbi EJB osztály viszont működik:

@Stateless
public class TokenService {
    @PersistenceContext
    private EntityManager em;

    public String validate(final String token) {
        System.out.println(em);
    }
}

Kérem szépen tisztelettel: értem én, hogy ez a final módosító a metóduson nem engedélyezett no-interface view esetén, mivelhogy a specifikáció ezt írja: "All methods exposed through the no-interface view must not be declared final."

 De hogy az alkalmazásszerver ennek ellenére rendben elindítja az EJB-t, szépen működik is minden a naplóbejegyzések szerint... kivéve, hogy nem végzi el az injection-t: az most bug vagy feature(smile)

      
      
Page viewed times
  • No labels
#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))