Konfiguracja
Na początek warto sprawdzić czy mamy załączone odpowiednie liby. Jest to raczej formalność, ale nigdy nic nie wiadomo.
Musimy również stworzyć klasę Activatora, która:org.jboss.spec.javax.ws.rs jboss-jaxrs-api_1.1_spec provided
- dziedziczy po javax.ws.rs.core.Application
- posiada adnotację @javax.ws.rs.ApplicationPath z zadeklarowaną ogólną ścieżką do naszych REST'ów
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
/* class body intentionally left blank */
}
Alternatywnie możemy umieścić kilka liniejek kodu w web.xml (opisane niżej).
RESTful Web Services
Klasa, która będzie wystawiać usługę typu REST powinna posiadać adnotację @javax.ws.rs.Path ze wskazaniem ścieżki pod jaką będzie widoczna usługa. Dodatkowo wskazujemy metodę, która będzie się wykonywać w momencie wywołania. Do tego celu wykorzystujemy adnotacje:
- @GET (lub @POST, @HEAD, @PUT, itd.) z pakietu javax.ws.rs. Dzięki temu możemy określić różne metody dla różnych typów wywołań (GET/POST/PUT/HEAD/...) REST'a.
- @javax.ws.rs.Produces z określeniem w jakim formacie będzie prezentowany wynik. Do dyspozycji mamy dwa popularne formaty: json ("application/json") i xml ("text/xml").
import java.util.List;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/hello")
public class HelloRestService {
@Inject
private HelloService helloService;
@GET
@Produces("application/json")
public List<Person>> getPersons() {
return helloService.getPersons();
}
}
Tak stworzona usługa będzie widniała pod adresem http://127.0.0.1:8080/myApp/rest/hello.
Parametry
Jedno z podstawowych pytań, jakie warto zadać to: Jak przekazywać parametry do naszych usług? Odpowiedź jest bardzo prosta. Wystarczy stworzyć metodę z parametrami i wykorzystać kilka adnotacji. W kodzie wygląda to mniej więcej tak:
@GET
@Path("/{id}")
@Produces("application/json")
public Person getPerson(@PathParam("id") int id) {
return helloService.getPerson(id);
}
W adnotacji @javax.ws.rs.Path wskazujemy jak w URL'u będą przekazywane parametry. Parametry oznaczamy w klamrowych nawiasach, np. {param1}. W ścieżce może pojawiać się statyczny tekst, np. "/personId/{id}". Kolejna przydatna adnotacja to @javax.ws.rs.PathParam, która wstawia parametry w odpowiednie miejsca w metodzie. Efekt możemy zobaczyć pod adresem: http://127.0.0.1:8080/myApp/rest/hello/1.
web.xml
Alternatywnie możemy umieścić całą konfigurację w web.xml. Jeśli ktoś ma potrzebę albo po porostu preferuje taki sposób konfiguracji, to wystarczy, że skopiuje poniższy fragment kodu. Oczywiście w takim wypadku nie potrzebujemy już klasy Activatora, możemy ją po prostu usunąć.
Resteasy org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher resteasy.servlet.mapping.prefix /rest 1 resteasy.scan true Resteasy /rest/*
XML
Wspomniałem już że Rest'y poza jsonem wspierają również XML. Niestety sprawa się trochę komplikuje, ponieważ obiekt, który ma zostać zamieniony na XML, wymaga małego tuningu :). Jeśli zwracane obiekty nie będą dostosowane, to w przeglądarce zobaczymy błąd 500, a w konsoli błąd:
Failed executing GET /hello/1: org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: pl.mkorwel.sample.rest.app.rest.Person of media type: text/xmlCały trick polega na dodaniu do klasy adnotacji @javax.xml.bind.annotation.XmlRootElement oraz stworzeniu bezargumentowego konstruktora. Klasa powinna wyglądać mniej więcej tak:
@XmlRootElement
public class Person {
private String name;
private String surname;
public Person() {
}
public Person(String name, String surname) {
super();
this.name = name;
this.surname = surname;
}
// GET i SET
}
Jeśli macie jakieś pytania/sugestie, zapraszam do umieszczania ich w komentarzach.