package org.superbiz.rest; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @Path("/greeting") public class GreetingService { @GET public String message() { return "Hi REST!"; } @POST public String lowerCase(final String message) { return "Hi REST!".toLowerCase(); } }
REST Simples
Definir um serviço REST é fácil, simplesmente adicione a anotação @Path
na classe, então defina o método HTTP (@GET
, @POST
, …) ao método da classe que deseja usar.
O código
O Serviço REST: @Path
, @GET
, @POST
Aqui nós temos um REST simples, anotamos a classe com @Path("/greeting")
para indicar a rota correspondente a classe GreetingService
. Definimos message()
como @GET
e lowerCase()
como @POST
para esta rota /greeting
. Pronto, temos um serviço! Simples não?
Testando
Teste para o serviço JAXRS
Usamos o OpenEJB ApplicationComposer
para facilitar o teste.
A ideia é primeiro ativar os serviços jaxrs
. Isto é feito usando a anotação @EnableServices
.
Então nós criamos a aplicação simplesmente retornando um objeto representando o web.xml
. Aqui nós simplesmente o usamos para definir o contexto raiz mas você também pode usar para definir sua aplicação REST também. E para completar a aplicação nós adicionamos a anotação @Classes
para definir o conjunto de classes a ser utilizado nesse app.
Finalmente para testar nós usamos o client API do cfx
para chamar o serviço REST nos métodos get()
e post()
.
package org.superbiz.rest; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.openejb.jee.SingletonBean; import org.apache.openejb.junit.ApplicationComposer; import org.apache.openejb.testing.EnableServices; import org.apache.openejb.testing.Module; import org.junit.Test; import org.junit.runner.RunWith; import java.io.IOException; import static org.junit.Assert.assertEquals; @EnableServices(value = "jaxrs") @RunWith(ApplicationComposer.class) public class GreetingServiceTest { @Module public SingletonBean app() { return (SingletonBean) new SingletonBean(GreetingService.class).localBean(); } @Test public void get() throws IOException { final String message = WebClient.create("http://localhost:4204").path("/GreetingServiceTest/greeting/").get(String.class); assertEquals("Hi REST!", message); } @Test public void post() throws IOException { final String message = WebClient.create("http://localhost:4204").path("/GreetingServiceTest/greeting/").post("Hi REST!", String.class); assertEquals("hi rest!", message); } }
Running
Executar o exemplo é bastante simples. No diretório simple-rest
dê o seguinte comando:
$ mvn clean install
Com isso, provavelmente você terá a seguinte saida.
INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed. INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) INFO - Creating TransactionManager(id=Default Transaction Manager) INFO - Creating SecurityService(id=Default Security Service) INFO - Initializing network services INFO - Creating ServerService(id=httpejbd) INFO - Creating ServerService(id=cxf-rs) INFO - Initializing network services INFO - Starting service httpejbd INFO - Started service httpejbd INFO - Starting service cxf-rs INFO - Started service cxf-rs INFO - ** Bound Services ** INFO - NAME IP PORT INFO - httpejbd 127.0.0.1 4204 INFO - ------- INFO - Ready! INFO - Configuring enterprise application: /opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) INFO - Auto-creating a container for bean org.superbiz.rest.GreetingServiceTest: Container(type=MANAGED, id=Default Managed Container) INFO - Creating Container(id=Default Managed Container) INFO - Using directory /tmp for stateful session passivation INFO - Enterprise application "/opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest" loaded. INFO - Assembling app: /opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest INFO - Existing thread singleton service in SystemInstance() null INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@12c9b196 INFO - Succeeded in installing singleton service INFO - OpenWebBeans Container is starting... INFO - Adding OpenWebBeansPlugin : [CdiPlugin] INFO - All injection points are validated successfully. INFO - OpenWebBeans Container has started, it took 11 ms. INFO - Deployed Application(path=/opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest) INFO - Setting the server's publish address to be http://127.0.0.1:4204/test INFO - REST Service: http://127.0.0.1:4204/test/greeting/.* -> Pojo org.superbiz.rest.GreetingService INFO - Undeploying app: /opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest INFO - Stopping network services INFO - Stopping server services Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0