10 marca 2011

Jedynie beanName albo lookup w @EJB dozwolone, a GlassFish 3.1 akceptuje oba równocześnie

A to dopiero znalezisko! Właśnie natrafiłem na błąd w GlassFish 3.1 przy obsłudze adnotacji @EJB.

Zgodnie z javadoc dla @EJB:

"Either the beanName or the lookup element can be used to resolve the EJB dependency to its target session bean component. It is an error to specify values for both beanName and lookup."

Stąd należałoby oczekiwać, że uruchomienie poniższego komponentu EJB powinno zakończyć się błędem - zwróć uwagę na adnotację @EJB z atrybutami beanName oraz lookup.
package pl.japila.ejb.test;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import pl.japila.ejb.Hello;

@Stateless
public class TestFacadeEJB implements Hello {

    @EJB(beanName="HelloInEnglish", lookup="java:global/classes/HelloPoPolsku")
    Hello hello;

    @Override
    public String sayHello(String whom) {
        return hello.sayHello(whom);
    }

}
Nic bardziej mylnego! Wdrożenie takiego EJB jest całkowicie legalne w GlassFish i nie zakończy się błędem.

Pytanie uzupełniające: Który z atrybutów ma wyższy priorytet - beanName czy lookup, czyli które będzie brane pod uwagę przy rozwiązywaniu @EJB?

Odpowiedź pozostawiam najbardziej dociekliwym i wytrwałym, którzy przykład uruchomili korzystając z artykułu Słabo typizowane DI w EJB 3.x - o beanName w @EJB jeszcze raz.

A jak to jest w innych serwerach? Sprawdzę jeszcze WAS8 i OpenEJB 3.1.4, a ucieszyłbym się, gdybym dowiedział się od kogoś jak to jest obsłużone w JBoss AS 6 czy Oracle WebLogic Server 11g?

2 komentarze:

  1. Sprawdziłem z JBossem 6. Wyższy atrybut ma beanName. Ale żeby nie było zbyt łatwo, to mam pewną wątpliwość. Mianowicie wrzucenie na serwer wersji mojej testowej aplikacji w której EJB było wywoływane w ten sposób:
    @EJB(lookup="java:global/classes/HelloInEnglish")
    Hello hello;
    lub
    @EJB(lookup="java:global/classes/HelloPoPolsku")
    Hello hello;

    kończyło się w obu przypadkach błędem:
    [EJB Reference: beanInterface 'com.test.ejb.Hello', beanName '', mappedName 'null'] was matched by more than one EJB

    a spodziewałbym się, że powinny działać, tak ja w przypadku wywołań

    @EJB(beanName="HelloInEnglish")
    Hello hello;
    lub
    @EJB(beanName="HelloPoPolsku"
    Hello hello;

    które to zwracały poprawne wartości.

    OdpowiedzUsuń
  2. Podejrzewam, że JBAS6 nie sprawdza poprawności lookup, które nie zwraca instancji i w @EJB do głosu dochodzi konstrukcja @EJB Hello hello, czyli brak jednoznacznego wskazania i...kończy się błędem.

    Gdyby nie fakt, że przy niepoprawnym lookup oczekiwałbym błędu przy wdrożeniu, albo samym uruchomieniu z innym niż w/w komunikat, byłoby całkiem poprawnie dla mnie.

    Zmusiłeś mnie, aby przyjrzał się JBAS6. Dzięki :)

    OdpowiedzUsuń