niedziela, 1 lutego 2009

Dramat w czterech aktach - WebService (na szczęście z happyendem)

Jako dopełnienie serii postów związanych z technologiami JEE zaprezentuje wam przykładowe użycie WebSerwisów, wszystko oczywiście przy wykorzystaniu JBoss'a 5.0. Zaczynamy

Akt I

W przykładzie zostanie użyta prosta, lekko okrojona encja z mojego projektu zaliczeniowego.

package org.gen2.biblioteka.encje;

@Entity
public class Autor implements Serializable {


private static final long serialVersionUID = 1L;

private int id;
private String imie;
private String nazwisko;

public Autor() {
super();
}

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getImie() {
return imie;
}

public void setImie(String imie) {
this.imie = imie;
}

public String getNazwisko() {
return nazwisko;
}

public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}

public String toString() {
return imie + " " + nazwisko;
}
}


Akt II

Definiujemy prosty interfejs (z jedna metoda) dla bean'a który będzie naszym WebSerwisem (tudzież Usługą Sieciową)


package org.gen2.biblioteka.beany;

@WebService
@SOAPBinding(style = Style.DOCUMENT)
public interface AutorWSInterface {
ArrayList pobierzAutora(int idAutora);
}


@WebService - oznacza, ze intefejs będzie służył do implementacji WebSerwisu
@SOAPBinding - definiuje sposób komunikacji pomiędzy 'klientem' a 'serwerem', nie zaleca sie mieszanie style = RPC z use = LITERAL (JBoss w wersji 5.0 nie obsługuje tego jeszcze poprawnie)

Akt III

A teraz sama implemetacja bean'a.

package org.gen2.biblioteka.beany;

@Stateless
@WebService(endpointInterface = "org.gen2.biblioteka.beany.AutorWSInterface")
@SOAPBinding(style = Style.DOCUMENT)
public class AutorWSBean {

private @PersistenceContext(unitName="BibliotekaEJB")
EntityManager em;

@WebMethod
public ArrayList pobierzAutora(int idAutora) {
Query query = em.createQuery("select a from Autor as a where a.id = " + idAutora);
ArrayList autor = new ArrayList();
Autor temp = (Autor) query.getSingleResult();

autor.add(temp.getImie());
autor.add(temp.getNazwisko());

return autor;
}
}


@WebService(endpointInterface = "org.gen2.biblioteka.beany.AutorWSInterface") - musi wskazywać na intefejs który klasa ma implementować.
@WebMethod - jest użyteczne gdy mamy wiecej metod w beanie i chcemy żeby tylko niektóre były "eksportowane" do WSDL'a.

Akt IV

A teraz jak tego użyc?
Najpierw musimy wrzucić nasz projekt na serwer, następnie tworzymy w eclipsie nowy projekt, naciskamy Ctrl + N, z menu wybieramy 'Web Services', 'Web Service Client', w 'Service Definition' wklejamy link do naszego WSDL (link możemy znalezć na stronie, nie musimy sie przekopywać przez tony logów tak jak np. w Geronimo), klikamy 'Finish' i mamy utworzony interfejs do połączenia z naszym WebSerwisem, teraz napiszemy klase w ktorej przetesujemy jego dzialanie.

public class Test {

public static void main(String[] args) {

AutorWSBeanService abs = new AutorWSBeanServiceLocator();

try {
AutorWSInterface asi = abs.getAutorWSBeanPort();
String[] autor = asi.pobierzAutora(1);
System.out.println(autor[0] + " " + autor[1]);
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}

}


Happyend

Uruchamiamy powyższą aplikacje lokalnie. A poniżej mamy wynik działania programu.

Adam Mickiewicz



Tu byl wielki babol rzeczowy;)