19 września 2007

NetBeans IDE 6.0 Beta 1 oraz GlassFish V2 dostępne, ale czy gotowe?

Właśnie pojawiła się nowa wersja beta środowiska programistycznego NetBeans IDE 6.0 Beta 1. Rozpoczął się tym samym program NetCAT 6.0 (NetBeans IDE 6.0 Community Acceptance Testing), w którym zdeklarowałem zweryfikować poprawność działania kolejnych kandydatów na finalną wersję NetBeans IDE 6.0 w obszarach j2ee oraz web services (Participants of NetCAT 6.0 program). Jak się później okazało w wersji Beta 1 jest kilka błędów, które dyskwalifikują ją i konieczne jest pobranie wersji następnej, rozwojowej.

Zabawę czas zacząć!

Rozpocznę od stworzenia bardzo prymitywnej aplikacji Java EE 5 z wykorzystaniem jak najmniejszej liczby kroków, a tym bardziej uderzeń w klawiaturę (coś na wzór poprzedniego testu, którego wynikiem był artykuł - Tworzenie aplikacji EJB 3.0 z GlassFish v2, Apache Maven 2 i NetBeans IDE 6.0).

Tym razem zbuduję bezstanowe ziarno sesyjne EJB, które udostępnia wyłącznie interfejs usługi sieciowej (WS) oraz klienta korzystającego z niej (jakiż inny mógłbym wybrać przykład łączący EJB3 (obecne zainteresowanie) z Web Services w ramach NetBeans IDE 6 tak, aby kontynuować poznawanie EJB3 i sprawdzić działanie NetBeans IDE?!)

Przez serwer rozumiem serwer aplikacyjny zgodny ze specyfikacją Korporacyjnej Javy 5 (Java EE 5).
Przez aplikację korporacyjną rozumiem aplikację tworzoną przy wykorzystaniu elementów Korporacyjnej Javy.

Definiuję nowy serwer, który będzie wymagany przy tworzeniu aplikacji korporacyjnej. Jak miało to miejsce poprzednio wybieram GlassFish'a (ech, jak mi się marzy przedstawienie Apache Geronimo 2.0.1 z wtyczką dla NetBeans IDE 6.0, ale to jeszcze musi trochę poczekać). Serwer pobieram w ramach paczki dystrybucyjnej NetBeans IDE 6.0 Beta 1 bądź jako osobny projekt ze strony GlassFish Project - V2 Final Build (aka b58g Promoted Build). Instrukcje tworzenia nowego serwera można znaleźć we wspomnianym wcześniej artykule.


Zaczynam od stworzenia projektu ziarna - MojPierwszyWsEJB - menu Enterprise > EJB Module, wskazuję na serwer GlassFish (jeśli jest jedynym serwerem to będzie automatycznie wybrany) i zatwierdzam formatkę definiowania projektu.

Tworzę nowy pakiet (menu New > Java Package) - pl.jaceklaskowski.ejbws.

W menu kontekstowym nowego pakietu wybieram New > Session Bean... podaję EJB Name jako MojPierwszyWsEJB i zatwierdzam formatkę.

Jakkolwiek zgodnie z komentarzem w klasie ziarna możnaby skorzystać z menu kontekstowego Web Service > Add Operation to faktycznie takie menu nie istnieje. Zgłosiłem błąd [60cat] No Web Service > Add Operation menu yet the comment in EJB points to it.

Wybieramy Add Business Method i definiujemy bezparametrową metodą metodaBiznesowa. Ostatecznie ziarno wygląda następująco:

package pl.jaceklaskowski.ejbws;

import java.util.logging.Logger;
import javax.ejb.Stateless;

@Stateless
public class MojPierwszyWsEJBBean implements MojPierwszyWsEJBLocal {

Logger logger = Logger.getLogger(MojPierwszyWsEJBBean.class.toString());

public void metodaBiznesowa() {
logger.info("Metoda biznesowa metodaBiznesowa wywołana poprawnie");
}
}

gdzie lokalny interfejs biznesowy wygląda tak:

package pl.jaceklaskowski.ejbws;

import javax.ejb.Local;

@Local
public interface MojPierwszyWsEJBLocal {

void metodaBiznesowa();

}

New > Web Service... z domyślną nazwą NewWebService, w pakiecie pl.jaceklaskowski.ejbws (pole Package) i wybieram opcję Delegate to Existing Session Enterprise Bean ze wskazaniem na wcześniej stworzone ziarno. Finish. Niestety, w tym momencie pojawi się NPE, który zgłosiłem jako [60cat] NPE upon finishing New > Web Service in EJB project. Zamykam okno z komunikatem błędu (przycisk Close). Po pewnym czasie wszystko wraca do normy, tj. pojawia się pozycja MojPierwszyWsEJBBean w węźle Enterprise Beans, chociaż nie potrafię odtworzyć ścieżki poleceń, aby do tego momentu dojść. Tak, czy owak, zamknięcie okna z błędem kończy temat do momentu kolejnego rozwinięcia węzła Enterprise Beans, czego nie planuję zrobić ponownie.

package pl.jaceklaskowski.ejbws;

import javax.ejb.EJB;
import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.ejb.Stateless;

@WebService
@Stateless
public class NewWebService {

@EJB
private MojPierwszyWsEJBLocal ejbRef;

@WebMethod(operationName = "metodaBiznesowa")
@Oneway
public void metodaBiznesowa() {
ejbRef.metodaBiznesowa();
}
}

Zanim wywołam usługę sieciową, instaluję paczkę EJB na serwerze przez wywołanie menu Run. Próba wcześniejszego uruchomienia usługi kończy się komunikatem o niedostępności usługi na serwerze.

Wybieram menu Test Web Service z menu kontekstowego węzła MojPierwszyWsEJB/Web Services/NewWebService.

Wciskam przycisk metodaBiznesowa, która spowoduje wywołanie metody metodaBiznesowa ziarna MojPierwszyWsEJB, o czym można się przekonać w dzienniku zdarzeń GlassFish'a:

Invoking wsimport with http://localhost:8080/NewWebServiceService/NewWebService?WSDL
wsimport successful
Metoda biznesowa metodaBiznesowa wywolana poprawnie

Pomijając 2 błędy znalezione w międzyczasie tworzenie usługi sieciowej na bazie ziarna EJB można uznać za zakończone. Ze względu na błędy zmuszony byłem do zainstalowania wersji rozwojowej NetBeans IDE 6.0 z dnia 18.09.2007 (uwaga: odnośnik wskazuje na ostatnią wersję NetBeans IDE 6.0, więc w trakcie czytania wersja może być już nowsza).

W międzyczasie natrafiłem na artykuł zbliżone do tematu opublikowany na stronach netbeans.org - Getting Started with JAX-WS Web Services in NetBeans IDE 6.0. Zresztą jest ich więcej, m.in. na stronie Web Application Learning Trail oraz Java EE Applications Learning Trail w sekcji NetBeans IDE 6.0 Beta Tutorials.