You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by GitBox <gi...@apache.org> on 2020/06/07 21:05:25 UTC

[GitHub] [tomee] hbelmiro commented on a change in pull request #653: Translate to Portuguese: examples/mp-jsonb-configuration

hbelmiro commented on a change in pull request #653:
URL: https://github.com/apache/tomee/pull/653#discussion_r436400800



##########
File path: examples/mp-jsonb-configuration/README_pt.adoc
##########
@@ -0,0 +1,308 @@
+:index-group: Unrevised
+:jbake-type: page
+:jbake-status: status=published
+= Configurando JSON-B
+
+Este exemplo mostra como personalizar jsonb para uma aplicação JAX-RS.
+JSONB é o novo padrão `javaee-api: 8.0` para serialização/desserialização de json. 
+Poucas anotações são necessárias e o `JsonbConfig` oferece muitas configurações.
+
+== Executando e testando o Endpoint
+
+A aplicação pode ser executada com `mvn clean install tomee: run` e se a porta 8080 estiver disponivel,pode invocar o seguinte endpoint:

Review comment:
       ```suggestion
   A aplicação pode ser executada com `mvn clean install tomee: run` e se a porta 8080 estiver disponível, pode invocar o seguinte endpoint:
   ```

##########
File path: examples/mp-jsonb-configuration/README_pt.adoc
##########
@@ -0,0 +1,308 @@
+:index-group: Unrevised
+:jbake-type: page
+:jbake-status: status=published
+= Configurando JSON-B
+
+Este exemplo mostra como personalizar jsonb para uma aplicação JAX-RS.
+JSONB é o novo padrão `javaee-api: 8.0` para serialização/desserialização de json. 
+Poucas anotações são necessárias e o `JsonbConfig` oferece muitas configurações.
+
+== Executando e testando o Endpoint
+
+A aplicação pode ser executada com `mvn clean install tomee: run` e se a porta 8080 estiver disponivel,pode invocar o seguinte endpoint:
+
+[source,bash]
+----
+$ curl -X GET http://localhost:8080/mp-jsonb-configuration/api/users
+----
+
+que deve responder com o seguinte json:
+
+[source,bash]
+----
+[
+  {
+    "Id":1,
+    "Name":"user 1",
+    "Registration":"2018 - 12 - 28"
+  },
+  {
+    "Id":2,
+    "Name":"user 2",
+    "Registration":"2018 - 12 - 28"
+  }
+]
+----
+
+== @ApplicationPath
+
+A classe de ponto de partida JAX-RS
+
+A classe de ponto de entrada JAXRS, da seguinte forma, os jaxrs carregarão todas as classes e métodos anotados com `@Path` sem especificá-los.
+
+[source,java]
+----
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+----
+
+== @Path Recurso Rest
+
+Classe jaxrs simples com um método GET
+
+[source,java]
+----
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Stateless;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.User;
+
+@Path("users")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Stateless
+public class UserService {
+
+    @GET
+    public List<User> users() {
+        List<User> users = new ArrayList<>();
+        User user1 = new User(1, "user 1");
+        User user2 = new User(2, "user 2");
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+}
+----
+
+== Configurando JSONB
+
+A implementação de `ContextResolver<>` pode personalizar os padrões de jaxrs; neste exemplo, vamos personalizar a serialização/desserialização JSONB
+
+[source,java]
+----
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.config.PropertyNamingStrategy;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class JSONBConfiguration implements ContextResolver<Jsonb> {
+
+    private Jsonb jsonb;
+
+    public JSONBConfiguration() {
+        // jsonbConfig offers a lot of configurations.
+        JsonbConfig config = new JsonbConfig().withFormatting(true)
+                .withPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)
+                .withDateFormat("yyyy - MM - dd", Locale.ENGLISH);
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+----
+
+`JsonbConfig` oferece muitas configurações.
+
+== Acessando o Recurso Rest
+
+O teste ativa um aplicativo da web openejb e chama o restante do recurso `/users`

Review comment:
       ```suggestion
   O teste ativa um aplicativo da web openejb e invoca o endpoint `/users`
   ```

##########
File path: examples/mp-jsonb-configuration/README_pt.adoc
##########
@@ -0,0 +1,308 @@
+:index-group: Unrevised
+:jbake-type: page
+:jbake-status: status=published
+= Configurando JSON-B
+
+Este exemplo mostra como personalizar jsonb para uma aplicação JAX-RS.
+JSONB é o novo padrão `javaee-api: 8.0` para serialização/desserialização de json. 
+Poucas anotações são necessárias e o `JsonbConfig` oferece muitas configurações.
+
+== Executando e testando o Endpoint
+
+A aplicação pode ser executada com `mvn clean install tomee: run` e se a porta 8080 estiver disponivel,pode invocar o seguinte endpoint:
+
+[source,bash]
+----
+$ curl -X GET http://localhost:8080/mp-jsonb-configuration/api/users
+----
+
+que deve responder com o seguinte json:
+
+[source,bash]
+----
+[
+  {
+    "Id":1,
+    "Name":"user 1",
+    "Registration":"2018 - 12 - 28"
+  },
+  {
+    "Id":2,
+    "Name":"user 2",
+    "Registration":"2018 - 12 - 28"
+  }
+]
+----
+
+== @ApplicationPath
+
+A classe de ponto de partida JAX-RS
+
+A classe de ponto de entrada JAXRS, da seguinte forma, os jaxrs carregarão todas as classes e métodos anotados com `@Path` sem especificá-los.
+
+[source,java]
+----
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+----
+
+== @Path Recurso Rest
+
+Classe jaxrs simples com um método GET
+
+[source,java]
+----
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Stateless;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.User;
+
+@Path("users")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Stateless
+public class UserService {
+
+    @GET
+    public List<User> users() {
+        List<User> users = new ArrayList<>();
+        User user1 = new User(1, "user 1");
+        User user2 = new User(2, "user 2");
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+}
+----
+
+== Configurando JSONB
+
+A implementação de `ContextResolver<>` pode personalizar os padrões de jaxrs; neste exemplo, vamos personalizar a serialização/desserialização JSONB
+
+[source,java]
+----
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.config.PropertyNamingStrategy;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class JSONBConfiguration implements ContextResolver<Jsonb> {
+
+    private Jsonb jsonb;
+
+    public JSONBConfiguration() {
+        // jsonbConfig offers a lot of configurations.
+        JsonbConfig config = new JsonbConfig().withFormatting(true)
+                .withPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)
+                .withDateFormat("yyyy - MM - dd", Locale.ENGLISH);
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+----
+
+`JsonbConfig` oferece muitas configurações.
+
+== Acessando o Recurso Rest
+
+O teste ativa um aplicativo da web openejb e chama o restante do recurso `/users`
+
+[source,java]
+----
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.superbiz.JAXRSApplication;
+import org.superbiz.JSONBConfiguration;
+
+@EnableServices(value = "jaxrs")
+@RunWith(ApplicationComposer.class)
+public class UserServiceTest {
+
+    @Module
+    @Classes({ UserService.class, JAXRSApplication.class, JSONBConfiguration.class })
+    public WebApp app() {
+        return new WebApp().contextRoot("test");
+    }
+
+    @Test
+    public void get() throws IOException {
+        final String message = WebClient.create("http://localhost:4204").path("/test/api/users").get(String.class);
+        System.out.println(message);
+
+        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy - MM - dd");
+
+        // test withDateFormat("yyyy - MM - dd")
+        Assert.assertTrue(message.contains(sdf.format(new Date())));
+        // test withFormatting(true)
+        Assert.assertTrue(message.contains(System.getProperty("line.separator")));
+    }
+
+}
+----
+
+== Executando
+Executando o exemplo se pode fazer desde maven com um simples comando `mvn clean install`, executando desde o diretorio `mp-jsonb-configuration`.

Review comment:
       ```suggestion
   A execução do exemplo pode ser feita a partir do maven com um simples comando `mvn clean install`, executando no diretorio `mp-jsonb-configuration`.
   ```

##########
File path: examples/mp-jsonb-configuration/README_pt.adoc
##########
@@ -0,0 +1,308 @@
+:index-group: Unrevised
+:jbake-type: page
+:jbake-status: status=published
+= Configurando JSON-B
+
+Este exemplo mostra como personalizar jsonb para uma aplicação JAX-RS.
+JSONB é o novo padrão `javaee-api: 8.0` para serialização/desserialização de json. 
+Poucas anotações são necessárias e o `JsonbConfig` oferece muitas configurações.
+
+== Executando e testando o Endpoint
+
+A aplicação pode ser executada com `mvn clean install tomee: run` e se a porta 8080 estiver disponivel,pode invocar o seguinte endpoint:
+
+[source,bash]
+----
+$ curl -X GET http://localhost:8080/mp-jsonb-configuration/api/users
+----
+
+que deve responder com o seguinte json:
+
+[source,bash]
+----
+[
+  {
+    "Id":1,
+    "Name":"user 1",
+    "Registration":"2018 - 12 - 28"
+  },
+  {
+    "Id":2,
+    "Name":"user 2",
+    "Registration":"2018 - 12 - 28"
+  }
+]
+----
+
+== @ApplicationPath
+
+A classe de ponto de partida JAX-RS
+
+A classe de ponto de entrada JAXRS, da seguinte forma, os jaxrs carregarão todas as classes e métodos anotados com `@Path` sem especificá-los.
+
+[source,java]
+----
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+----
+
+== @Path Recurso Rest
+
+Classe jaxrs simples com um método GET
+
+[source,java]
+----
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Stateless;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.User;
+
+@Path("users")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Stateless
+public class UserService {
+
+    @GET
+    public List<User> users() {
+        List<User> users = new ArrayList<>();
+        User user1 = new User(1, "user 1");
+        User user2 = new User(2, "user 2");
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+}
+----
+
+== Configurando JSONB
+
+A implementação de `ContextResolver<>` pode personalizar os padrões de jaxrs; neste exemplo, vamos personalizar a serialização/desserialização JSONB
+
+[source,java]
+----
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.config.PropertyNamingStrategy;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class JSONBConfiguration implements ContextResolver<Jsonb> {
+
+    private Jsonb jsonb;
+
+    public JSONBConfiguration() {
+        // jsonbConfig offers a lot of configurations.
+        JsonbConfig config = new JsonbConfig().withFormatting(true)
+                .withPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)
+                .withDateFormat("yyyy - MM - dd", Locale.ENGLISH);
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+----
+
+`JsonbConfig` oferece muitas configurações.
+
+== Acessando o Recurso Rest
+
+O teste ativa um aplicativo da web openejb e chama o restante do recurso `/users`
+
+[source,java]
+----
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.superbiz.JAXRSApplication;
+import org.superbiz.JSONBConfiguration;
+
+@EnableServices(value = "jaxrs")
+@RunWith(ApplicationComposer.class)
+public class UserServiceTest {
+
+    @Module
+    @Classes({ UserService.class, JAXRSApplication.class, JSONBConfiguration.class })
+    public WebApp app() {
+        return new WebApp().contextRoot("test");
+    }
+
+    @Test
+    public void get() throws IOException {
+        final String message = WebClient.create("http://localhost:4204").path("/test/api/users").get(String.class);
+        System.out.println(message);
+
+        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy - MM - dd");
+
+        // test withDateFormat("yyyy - MM - dd")
+        Assert.assertTrue(message.contains(sdf.format(new Date())));
+        // test withFormatting(true)
+        Assert.assertTrue(message.contains(System.getProperty("line.separator")));
+    }
+
+}
+----
+
+== Executando
+Executando o exemplo se pode fazer desde maven com um simples comando `mvn clean install`, executando desde o diretorio `mp-jsonb-configuration`.
+
+Quando executado, você deve ver uma saída semelhante à seguinte:
+
+[source,java]
+----
+-------------------------------------------------------
+ T E S T S
+-------------------------------------------------------
+Running org.superbiz.rest.UserServiceTest
+INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@7823a2f9
+INFO - Succeeded in installing singleton service
+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=cxf-rs)
+INFO - Creating ServerService(id=httpejbd)
+INFO - Created ServicePool 'httpejbd' with (10) core threads, limited to (200) threads with a queue of (9)
+INFO - Initializing network services
+INFO -   ** Bound Services **
+INFO -   NAME                 IP              PORT
+INFO -   httpejbd             127.0.0.1       4204
+INFO - -------
+INFO - Ready!
+INFO - Configuring enterprise application: /home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest
+INFO - Auto-deploying ejb UserService: EjbDeployment(deployment-id=UserService)
+INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
+INFO - Auto-creating a container for bean org.superbiz.rest.UserServiceTest: Container(type=MANAGED, id=Default Managed Container)
+INFO - Creating Container(id=Default Managed Container)
+INFO - Using directory /tmp for stateful session passivation
+INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
+INFO - Auto-creating a container for bean UserService: Container(type=STATELESS, id=Default Stateless Container)
+INFO - Creating Container(id=Default Stateless Container)
+INFO - Enterprise application "/home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest
+INFO - Jndi(name=UserServiceLocalBean) --> Ejb(deployment-id=UserService)
+INFO - Jndi(name=global/test/UserService!org.superbiz.rest.UserService) --> Ejb(deployment-id=UserService)
+INFO - Jndi(name=global/test/UserService) --> Ejb(deployment-id=UserService)
+INFO - Created Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container)
+INFO - Started Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container)
+INFO - Using readers:
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@2f94c4db
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6b5966e1
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@65e61854
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@1568159
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@4fcee388
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@6f80fafe
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@63cd604c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@593e824f
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@72ccd81a
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6d8792db
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@64bc21ac
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@493dfb8e
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@5d25e6bb
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@72ccd81a
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@4fcee388
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@2f94c4db
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6b5966e1
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@65e61854
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@1568159
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@6f80fafe
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@63cd604c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@593e824f
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6d8792db
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@64bc21ac
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@361c294e
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@6fff253c
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@7859e786
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@285d851a
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@5af28b27
+INFO -      Service URI: http://127.0.0.1:4204/test/api/users ->  EJB org.superbiz.rest.UserService
+INFO -               GET http://127.0.0.1:4204/test/api/users ->      List<User> users()
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest)
+[
+  {
+    "Id":1,
+    "Name":"user 1",
+    "Registration":"2018 - 12 - 28"
+  },
+  {
+    "Id":2,
+    "Name":"user 2",
+    "Registration":"2018 - 12 - 28"
+  }
+]
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.203 sec
+
+Results :
+
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
+
+----
+
+=== Dentro do jar
+
+`javaee-api: 8.0` ele incorpora todas as dependências necessárias para ativar um aplicativo REST em funcionamento.
+
+Se olharmos para o jar construído por maven, veremos que o aplicativo em si é bem pequeno:

Review comment:
       ```suggestion
   Se olharmos para o jar construído pelo maven, veremos que o aplicativo em si é bem pequeno:
   ```

##########
File path: examples/mp-jsonb-configuration/README_pt.adoc
##########
@@ -0,0 +1,308 @@
+:index-group: Unrevised
+:jbake-type: page
+:jbake-status: status=published
+= Configurando JSON-B
+
+Este exemplo mostra como personalizar jsonb para uma aplicação JAX-RS.
+JSONB é o novo padrão `javaee-api: 8.0` para serialização/desserialização de json. 
+Poucas anotações são necessárias e o `JsonbConfig` oferece muitas configurações.
+
+== Executando e testando o Endpoint
+
+A aplicação pode ser executada com `mvn clean install tomee: run` e se a porta 8080 estiver disponivel,pode invocar o seguinte endpoint:
+
+[source,bash]
+----
+$ curl -X GET http://localhost:8080/mp-jsonb-configuration/api/users
+----
+
+que deve responder com o seguinte json:
+
+[source,bash]
+----
+[
+  {
+    "Id":1,
+    "Name":"user 1",
+    "Registration":"2018 - 12 - 28"
+  },
+  {
+    "Id":2,
+    "Name":"user 2",
+    "Registration":"2018 - 12 - 28"
+  }
+]
+----
+
+== @ApplicationPath
+
+A classe de ponto de partida JAX-RS
+
+A classe de ponto de entrada JAXRS, da seguinte forma, os jaxrs carregarão todas as classes e métodos anotados com `@Path` sem especificá-los.
+
+[source,java]
+----
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+----
+
+== @Path Recurso Rest
+
+Classe jaxrs simples com um método GET
+
+[source,java]
+----
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Stateless;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.User;
+
+@Path("users")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Stateless
+public class UserService {
+
+    @GET
+    public List<User> users() {
+        List<User> users = new ArrayList<>();
+        User user1 = new User(1, "user 1");
+        User user2 = new User(2, "user 2");
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+}
+----
+
+== Configurando JSONB
+
+A implementação de `ContextResolver<>` pode personalizar os padrões de jaxrs; neste exemplo, vamos personalizar a serialização/desserialização JSONB
+
+[source,java]
+----
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.config.PropertyNamingStrategy;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class JSONBConfiguration implements ContextResolver<Jsonb> {
+
+    private Jsonb jsonb;
+
+    public JSONBConfiguration() {
+        // jsonbConfig offers a lot of configurations.
+        JsonbConfig config = new JsonbConfig().withFormatting(true)
+                .withPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)
+                .withDateFormat("yyyy - MM - dd", Locale.ENGLISH);
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+----
+
+`JsonbConfig` oferece muitas configurações.
+
+== Acessando o Recurso Rest
+
+O teste ativa um aplicativo da web openejb e chama o restante do recurso `/users`
+
+[source,java]
+----
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.superbiz.JAXRSApplication;
+import org.superbiz.JSONBConfiguration;
+
+@EnableServices(value = "jaxrs")
+@RunWith(ApplicationComposer.class)
+public class UserServiceTest {
+
+    @Module
+    @Classes({ UserService.class, JAXRSApplication.class, JSONBConfiguration.class })
+    public WebApp app() {
+        return new WebApp().contextRoot("test");
+    }
+
+    @Test
+    public void get() throws IOException {
+        final String message = WebClient.create("http://localhost:4204").path("/test/api/users").get(String.class);
+        System.out.println(message);
+
+        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy - MM - dd");
+
+        // test withDateFormat("yyyy - MM - dd")
+        Assert.assertTrue(message.contains(sdf.format(new Date())));
+        // test withFormatting(true)
+        Assert.assertTrue(message.contains(System.getProperty("line.separator")));
+    }
+
+}
+----
+
+== Executando
+Executando o exemplo se pode fazer desde maven com um simples comando `mvn clean install`, executando desde o diretorio `mp-jsonb-configuration`.
+
+Quando executado, você deve ver uma saída semelhante à seguinte:
+
+[source,java]
+----
+-------------------------------------------------------
+ T E S T S
+-------------------------------------------------------
+Running org.superbiz.rest.UserServiceTest
+INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@7823a2f9
+INFO - Succeeded in installing singleton service
+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=cxf-rs)
+INFO - Creating ServerService(id=httpejbd)
+INFO - Created ServicePool 'httpejbd' with (10) core threads, limited to (200) threads with a queue of (9)
+INFO - Initializing network services
+INFO -   ** Bound Services **
+INFO -   NAME                 IP              PORT
+INFO -   httpejbd             127.0.0.1       4204
+INFO - -------
+INFO - Ready!
+INFO - Configuring enterprise application: /home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest
+INFO - Auto-deploying ejb UserService: EjbDeployment(deployment-id=UserService)
+INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
+INFO - Auto-creating a container for bean org.superbiz.rest.UserServiceTest: Container(type=MANAGED, id=Default Managed Container)
+INFO - Creating Container(id=Default Managed Container)
+INFO - Using directory /tmp for stateful session passivation
+INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
+INFO - Auto-creating a container for bean UserService: Container(type=STATELESS, id=Default Stateless Container)
+INFO - Creating Container(id=Default Stateless Container)
+INFO - Enterprise application "/home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest
+INFO - Jndi(name=UserServiceLocalBean) --> Ejb(deployment-id=UserService)
+INFO - Jndi(name=global/test/UserService!org.superbiz.rest.UserService) --> Ejb(deployment-id=UserService)
+INFO - Jndi(name=global/test/UserService) --> Ejb(deployment-id=UserService)
+INFO - Created Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container)
+INFO - Started Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container)
+INFO - Using readers:
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@2f94c4db
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6b5966e1
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@65e61854
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@1568159
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@4fcee388
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@6f80fafe
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@63cd604c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@593e824f
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@72ccd81a
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6d8792db
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@64bc21ac
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@493dfb8e
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@5d25e6bb
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@72ccd81a
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@4fcee388
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@2f94c4db
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6b5966e1
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@65e61854
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@1568159
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@6f80fafe
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@63cd604c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@593e824f
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6d8792db
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@64bc21ac
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@361c294e
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@6fff253c
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@7859e786
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@285d851a
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@5af28b27
+INFO -      Service URI: http://127.0.0.1:4204/test/api/users ->  EJB org.superbiz.rest.UserService
+INFO -               GET http://127.0.0.1:4204/test/api/users ->      List<User> users()
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest)
+[
+  {
+    "Id":1,
+    "Name":"user 1",
+    "Registration":"2018 - 12 - 28"
+  },
+  {
+    "Id":2,
+    "Name":"user 2",
+    "Registration":"2018 - 12 - 28"
+  }
+]
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/mp-jsonb-configuration/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.203 sec
+
+Results :
+
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
+
+----
+
+=== Dentro do jar
+
+`javaee-api: 8.0` ele incorpora todas as dependências necessárias para ativar um aplicativo REST em funcionamento.
+
+Se olharmos para o jar construído por maven, veremos que o aplicativo em si é bem pequeno:
+
+[source,bash]
+----
+$ jar tvf target/mp-jsonb-configuration-8.0.0-SNAPSHOT.war
+     0 Fri Dec 28 19:36:10 CET 2018 META-INF/
+   134 Fri Dec 28 19:36:08 CET 2018 META-INF/MANIFEST.MF
+     0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/
+     0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/
+     0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/org/
+     0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/org/superbiz/
+     0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/org/superbiz/model/
+     0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/org/superbiz/rest/
+  1165 Fri Dec 28 19:36:06 CET 2018 WEB-INF/classes/org/superbiz/model/User.class
+   402 Fri Dec 28 19:36:06 CET 2018 WEB-INF/classes/org/superbiz/JAXRSApplication.class
+  1194 Fri Dec 28 19:36:06 CET 2018 WEB-INF/classes/org/superbiz/rest/UserService.class
+  1701 Fri Dec 28 19:36:06 CET 2018 WEB-INF/classes/org/superbiz/JSONBConfiguration.class
+  1224 Fri Dec 28 18:28:32 CET 2018 WEB-INF/web.xml
+     0 Fri Dec 28 19:36:10 CET 2018 META-INF/maven/
+     0 Fri Dec 28 19:36:10 CET 2018 META-INF/maven/org.superbiz/
+     0 Fri Dec 28 19:36:10 CET 2018 META-INF/maven/org.superbiz/mp-jsonb-configuration/
+  1791 Fri Dec 28 19:10:44 CET 2018 META-INF/maven/org.superbiz/mp-jsonb-configuration/pom.xml
+   128 Fri Dec 28 19:36:08 CET 2018 META-INF/maven/org.superbiz/mp-jsonb-configuration/pom.properties
+----
+
+Esse jar individual pode ser implementado em qualquer implementação Java EE que atenda aos requisitos. No TomEE, basta colocá-lo no diretório `${tomee.home}/webapps/`.

Review comment:
       ```suggestion
   Esse jar individual pode ser implantado em qualquer implementação Java EE que atenda aos requisitos. No TomEE, basta colocá-lo no diretório `${tomee.home}/webapps/`.
   ```




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org