| :index-group: REST |
| :jbake-type: page |
| :jbake-status: status=published |
| |
| = 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? |
| |
| [source,java] |
| ---- |
| 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(); |
| } |
| } |
| ---- |
| |
| == 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()``. |
| |
| [source,java] |
| ---- |
| 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: |
| [source,java] |
| ---- |
| $ mvn clean install |
| ---- |
| Com isso, provavelmente você terá a seguinte saida. |
| [source,java] |
| ---- |
| 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 |
| ---- |