Wyświetlenie JNDI name w Servlet komponentu EJB (Stateless session bean)

0

Witam,
Napisałem taki kod:

package com.mycompany;

import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "HelloServlet", urlPatterns = {"/"})
public class HelloServlet extends HttpServlet {

    @EJB
    protected HelloWorldSessionBeanLocal helloEJB;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet HelloServlet</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println(helloEJB.getHelloMessage());
            out.println("</body>");
            out.println("</html>");
        } finally {            
            out.close();
        }
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "EJB test";
    }
}

Kod interfejsu:

package com.mycompany;

import javax.ejb.Local;

@Local
public interface HelloWorldSessionBeanLocal {
    public String getHelloMessage();
}

Kod implementacji:

package com.mycompany;

import javax.ejb.Stateless;

@Stateless
public class HelloWorldSessionBean implements HelloWorldSessionBeanLocal {

    @Override
    public String getHelloMessage() {
        return "Hello World";
    }
}

Uzywam serwera Glassfish v4 OSE. Daze do wstrzykiwania @ejb w beanach springowych (kontrolery i service), ale zanim zaczne to robic chce poznac nazwy zasobow, ktore chce wstrzyknac.

Pytania:

  1. Jak wyswietlic rzeczywiste JNDI/name wstrzykiwanego/wstrzyknietego komponentu EJB? Chce, aby na stronie pod "Hello World" znalazlo sie JNDI name.
  2. Jak ustawic dowolna nazwe kompomentu EJB np. na "ejb/testowy"? (wyswietlenie pozwoli mi upewnic sie, ze customowa nazwa dziala)
  3. Czym w praktyce sie rozni @stateless(mappedname = "") od @stateless(name = "")?

W dokumentacji pisza:

javax.​ejb.​Stateless
public abstract String mappedName
A product specific name(e.g. global JNDI name) that this session bean should be mapped to. Application servers are not required to support any particular form or type of mapped name, nor the ability to use mapped names. The mapped name is product-dependent and often installation-dependent. No use of a mapped name is portable.

Slowo should be mapped to jest mocno niepokojace. Czy to dziala na Glassfishu 4? Ja chce naprawde prosta rzecz: byc w stanie wyswietlac i ustawiac JNDI name.

Probowalem tak:

[root@centos64 bin]# ./asadmin list-jndi-entries --context=ejb
mgmt: com.sun.enterprise.naming.impl.TransientContext
Command list-jndi-entries executed successfully.

Nie ma moich JNDI od EJB. Gdzie one sa? Czy podaje zly kontekst? Mimo, ze na serwerze mam kilka aplikacji EJB nie widze zadnego JNDI name. Czy podaje zly kontekst?

Bede niezmiernie wdzieczny za wszelka pomoc.

Pozdrawiam,

0

Zapomnialem zapytac jeszcze o jedna bardzo wazna dla mnie kwestie: adnotacje @Remote i @local przy interfejsach.
Wiem, ze @local oznacza iz interfejs ma byc uzywany w biezacej aplikacji, a @Remote w zdalnych klientach (czasem i na zdalnych serwerach aplikacji).

Pytanie 4: Czy bean springowy zadowoli sie @local czy tez musi dostac @Remote interfejs jesli chce wspolpracowac z EJB?

0

Nic nie rozumiesz w kontekście Local i Remote...
One określają czy bean implementujący znajduje się w tym samym kontenerze czy też nie. Nic więcej. Aplikacja nie ma tu nic do rzeczy. Tylko kontener EJB (czyli zwykle de facto Serwer Aplikacyjny). Spring nie jest implementacją CDI w rozumieniu JEE, nie jest zarządzany przez kontener EJB, więc w ogóle nie potrafi wpółpracować z beanami Remote.

0

Dzieki za zainteresowanie moim problemem.

  1. Uswiadomienie w kwestii @Remote i @local jest juz dla mnie calkowicie jasne: krotko i na temat.
  2. Wiem, ze Spring nie jest zarzadzany przez kontener EJB, to konkurencyjna technologia. Problem polega na tym, ze musze (niekoniecznie chce) dokonac integracji: wstrzykiwac zasoby EJB do service springowych (logika biznesowa, miedzy innymi uzywana przez Spring Security). Jest to mozliwe i ponac nie jest to takie trudne:
    http://docs.spring.io/spring/docs/3.2.0.RELEASE/spring-framework-reference/htmlsingle/#ejb
    Reszta aplikacji dziala na EJB i JSF (Managed Beans, nie CDI beans, zamiast tego GUI wspomagaja beany springowe wstrzykujace logike biznesowa do managed beanow).

Niestety, aby to robic musze znac JNDI name zasobu, ktory chce wstrzyknac. W jaki sposob dowiedziec sie jaki jest JNDI name dla beana? Najlepiej wyswietlic go w locie.

0

Napisalem:
" Reszta aplikacji dziala na EJB i JSF (Managed Beans, nie CDI beans, zamiast tego GUI wspomagaja beany springowe wstrzykujace logike biznesowa do managed beanow)."

Mialem na mysli raczej:

  1. W EJB jest napisany backend (DAO do bazy, raporty, inne rzeczy jakie nie musialy byc w aplikacji internetowej).
  2. Czesc logiki biznesowej frontendu jest w Springu (mniej wiecej tak jak w tym lajtowym tutorialu: http://www.mkyong.com/jsf2/jsf-2-0-spring-integration-example/). Problem polega na tym, ze w tej springowej logice biznesowej trudno, ale sie da, wstrzyknac EJB. No i musze poznac to JNDI i mysle, ze wtedy zgodnie z tym co jest w dokumentacji Springa o integracji wszystko sie uda.

Sorry, ze bylem nieprecyzyjny.

0

Zobacz sobie JNDIView dla tej apliakcji i będziesz miał.
Zawsze JNDI dla EJB itp są nadawane na podstawie jakiegoś wzorca (zależy od serwera) typu:
nazwa ear/klasa implementacji/local czy coś takiego jak zgadniesz wzorzec to będziesz umiał sam konstruować te nazwy

0

Problem rozwiazany, ale w malo satysfakcjonujacy sposob. Nazwy JNDI beanow EJB znajduja sie w pliku server.log (sa wyjatkowo paskudne, zawieraja miedzy innymi nazwe wersji mavena). Pobieram nazwy globalne z tego miejsca, nastepnie mam dwie opcje:
a) @Resource(lookup = "adres JNDI bezwzgledny") KlasaObiektu obiekt;
b) recznie wywolac lookup na instancji InitialContext.
Ogolnie porazka z tym nazewnictwem, szkoda ze nie mozna przepisac na sztywno dowolnej nazwy. Ale przynajmiej mam jakis punkt zaczepienia.

Obawiam sie, ze JNDIView dziala tylko dla serwera JBoss.

1 użytkowników online, w tym zalogowanych: 0, gości: 1