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 20:35:02 UTC

[GitHub] [tomee] hbelmiro commented on a change in pull request #648: TOMEE-2824-Translate to Portuguese: examples/jsonb-custom-serializer

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



##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint

Review comment:
       ```suggestion
   Classe jaxrs simples com um endpoint GET e um POST
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta

Review comment:
       ```suggestion
   A Aplicação pode ser executada com `mvn clean install tomee:run' se a porta
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos

Review comment:
       ```suggestion
   Este exemplo mostra como personalizar a serialização/desserialização de objetos
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar

Review comment:
       ```suggestion
   === Dentro do jar
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar
+
+javaee-api:8.0 brings in all the dependencies needed to spin up a
+working REST application.

Review comment:
       aplicação REST funcionando

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)

Review comment:
       ```suggestion
   8080 está disponível, você pode invocar o seguinte endpoint: (GET)
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização

Review comment:
       ```suggestion
   Classe serializadora de objetos simples que adiciona `modified` durante a serialização
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.

Review comment:
       ```suggestion
   com jsonb para um aplicativo JAX-RS.
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json

Review comment:
       ```suggestion
   Cria um objeto a partir de um json
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.

Review comment:
       ```suggestion
   Classe JAXRS de ponto de entrada, da seguinte maneira, o jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar
+
+javaee-api:8.0 brings in all the dependencies needed to spin up a

Review comment:
       ```suggestion
   javaee-api:8.0 traz todas as dependências necessárias para iniciar uma
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar
+
+javaee-api:8.0 brings in all the dependencies needed to spin up a
+working REST application.

Review comment:
       ```suggestion
   aplicação REST funcionando.
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar
+
+javaee-api:8.0 brings in all the dependencies needed to spin up a
+working REST application.
+
+If we look at the jar built by maven, we’ll see the application itself

Review comment:
       ```suggestion
   Se olharmos para o jar construído pelo maven, veremos que a aplicação
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar
+
+javaee-api:8.0 brings in all the dependencies needed to spin up a
+working REST application.
+
+If we look at the jar built by maven, we’ll see the application itself
+is quite small:
+
+....
+$ jar tvf target/jsonb-custom-serializer-8.0.0-SNAPSHOT.war 
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/
+   134 Sat Dec 29 19:10:42 CET 2018 META-INF/MANIFEST.MF
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/model/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/rest/
+   790 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/model/Address.class
+  2093 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/model/User.class
+  2063 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/UserDeserializer.class
+   402 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/JAXRSApplication.class
+  1461 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/AddressSerializer.class
+  1498 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/rest/UserService.class
+  1549 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/JSONBConfiguration.class
+  1241 Sat Dec 29 17:52:48 CET 2018 WEB-INF/web.xml
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/org.superbiz/
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/
+  1811 Sat Dec 29 17:53:36 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/pom.xml
+   132 Sat Dec 29 19:10:42 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/pom.properties
+....
+
+This single jar could be deployed any any compliant Java EE
+implementation. In TomEE you’d simply place it in the

Review comment:
       ```suggestion
   . No TomEE você simplesmente colocaria-o no diretório
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar
+
+javaee-api:8.0 brings in all the dependencies needed to spin up a
+working REST application.
+
+If we look at the jar built by maven, we’ll see the application itself
+is quite small:
+
+....
+$ jar tvf target/jsonb-custom-serializer-8.0.0-SNAPSHOT.war 
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/
+   134 Sat Dec 29 19:10:42 CET 2018 META-INF/MANIFEST.MF
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/model/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/rest/
+   790 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/model/Address.class
+  2093 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/model/User.class
+  2063 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/UserDeserializer.class
+   402 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/JAXRSApplication.class
+  1461 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/AddressSerializer.class
+  1498 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/rest/UserService.class
+  1549 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/JSONBConfiguration.class
+  1241 Sat Dec 29 17:52:48 CET 2018 WEB-INF/web.xml
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/org.superbiz/
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/
+  1811 Sat Dec 29 17:53:36 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/pom.xml
+   132 Sat Dec 29 19:10:42 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/pom.properties
+....
+
+This single jar could be deployed any any compliant Java EE
+implementation. In TomEE you’d simply place it in the
+`tomee.home/webapps/` directory.

Review comment:
       ```suggestion
    `tomee.home/webapps/` .
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar
+
+javaee-api:8.0 brings in all the dependencies needed to spin up a
+working REST application.
+
+If we look at the jar built by maven, we’ll see the application itself
+is quite small:

Review comment:
       ```suggestion
   é bem pequena:
   ```

##########
File path: examples/jsonb-custom-serializer/README_pt.adoc
##########
@@ -0,0 +1,489 @@
+:index-group: JSON-B
+:jbake-type: page
+:jbake-status: status=published
+= Serializador personalizado JSON-B
+
+Este exemplo mostra como personalizar objetos
+serialização/desserialização com jsonb para um aplicativo JAX-RS.
+
+== Executando e testando o Endpoint
+
+A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponível, você pode invocar o seguinteendpoint: (GET)
+http://localhost:8080/jsonb-custom-serializer/api/users que deve responder com o seguinte json:
+
+....
+[
+  {
+    "address":{
+      "addr":"modified - addr1"
+    },
+    "id":1,
+    "name":"user 1",
+    "registration":"2018-12-29T18:13:40.028"
+  },
+  {
+    "address":{
+      "addr":"modified - addr2"
+    },
+    "id":2,
+    "name":"user 2",
+    "registration":"2018-12-29T18:13:40.028"
+  }
+]
+....
+
+e o endpoint: (POST)
+http://localhost:8080/jsonb-custom-serializer/api/users com um corpo como:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1", 
+    "extra": "extra1" 
+}
+....
+
+que respondem com o seguinte json:
+
+....
+{ 
+    "id": 1, 
+    "name": "name1extra1", 
+    "registration": "Sat Dec 29 19:48:05 CET 2018",
+    "address": null 
+}
+....
+
+== @ApplicationPath
+
+Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.
+
+....
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}
+....
+
+== Recurso @Path Rest
+
+Classe jaxrs simples com um GET e um POST endpoint
+
+....
+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.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.Address;
+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", new Address("addr1"));
+        User user2 = new User(2, "user 2", new Address("addr2"));
+        users.add(user1);
+        users.add(user2);
+
+        return users;
+    }
+
+    @POST
+    public User addUser(User u) {
+        // Apenas para mostrar a desserialização
+        return u;
+    }
+}
+....
+
+== Configuração JSONB
+
+Implementando ContextResolver<> você pode personalizar os padrões jaxrs; neste exemplo, personalizaremos a serialização JSONB para todos os objetos do tipo Address, definidos na classe AddressSerializer
+
+....
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+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 config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
+
+        jsonb = JsonbBuilder.create(config);
+    }
+
+    @Override
+    public Jsonb getContext(Class<?> type) {
+        return jsonb;
+    }
+
+}
+....
+
+== Address serializer
+
+Classe serializador de objetos simples que adiciona `modified 'durante a serialização
+
+....
+import javax.json.bind.serializer.JsonbSerializer;
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+import org.superbiz.model.Address;
+
+public class AddressSerializer implements JsonbSerializer<Address> {
+
+    @Override
+    public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
+        if (obj != null) {
+            obj.setAddr("modified - " + obj.getAddr());
+            ctx.serialize(obj, generator);
+        }
+
+    }
+
+}
+....
+
+== User Deserializer
+
+Create an object from a json
+
+....
+import java.lang.reflect.Type;
+
+import javax.json.JsonObject;
+import javax.json.bind.serializer.DeserializationContext;
+import javax.json.bind.serializer.JsonbDeserializer;
+import javax.json.stream.JsonParser;
+
+import org.superbiz.model.User;
+
+public class UserDeserializer implements JsonbDeserializer<User> {
+
+    @Override
+    public User deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+        JsonObject jo = parser.getObject();
+        String name = jo.get("name").toString().replace("\"", "");
+        if (jo.get("extra") != null) {
+            name = name + jo.get("extra").toString().replace("\"", "");
+        }
+        User u = new User(Integer.parseInt(jo.get("id").toString()), name, null);
+
+        return u;
+    }
+
+}
+....
+
+== Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer
+
+Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado
+
+....
+import java.util.Date;
+
+import javax.json.bind.annotation.JsonbTypeDeserializer;
+
+import org.superbiz.UserDeserializer;
+
+@JsonbTypeDeserializer(UserDeserializer.class)
+public class User {
+
+    private Integer id;
+    private String name;
+    private Date registration = new Date();
+    private Address address;
+
+    public User(Integer id, String name, Address address) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.address = address;
+    }
+
+    public User() {
+        super();
+    }
+
+    // ... GET/SET
+
+} 
+....
+
+== Acessando o endpoint rest
+
+O teste gera um aplicativo da web openejb e chama o endpoint do usuário
+
+....
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.superbiz.model.User;
+
+@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);
+
+        Assert.assertTrue(message.contains("modified - addr1"));
+    }
+
+    @Test
+    public void post() throws IOException {
+        final String inputJson = "{ \"id\": 1, \"name\": \"user1\", \"extra\": \"extraField\"}";
+        final User responseUser = WebClient.create("http://localhost:4204").path("/test/api/users")
+                .type(MediaType.APPLICATION_JSON).post(inputJson, User.class);
+
+        Assert.assertTrue(!responseUser.getName().equals("user1"));
+        Assert.assertTrue(responseUser.getName().equals("user1" + "extraField"));
+    }
+
+}
+....
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-custom-serializer'.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+....
+-------------------------------------------------------
+ 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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@591e58fa
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@3954d008
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@4b6579e8
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@841e575
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@6a1d204a
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@28a0fd6c
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@2b62442c
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@66629f63
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@27a5328c
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@6fff253c
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@6c6357f9
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@403132fc
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@32cb636e
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@71c5b236
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@2cab9998
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@285d851a
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+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/jsonb-custom-serializer/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/jsonb-custom-serializer/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/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@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using writers:
+INFO -      org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@66d23e4a
+INFO -      org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@36ac8a63
+INFO -      org.apache.cxf.jaxrs.provider.StringTextProvider@3dddbe65
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@f5c79a6
+INFO -      org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@51a06cbe
+INFO -      org.apache.cxf.jaxrs.provider.FormEncodingProvider@6cc0bcf6
+INFO -      org.apache.cxf.jaxrs.provider.MultipartProvider@29539e36
+INFO -      org.apache.cxf.jaxrs.provider.SourceProvider@32f61a31
+INFO -      org.apache.cxf.jaxrs.provider.JAXBElementProvider@669253b7
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@5ab14cb9
+INFO -      org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@62dae245
+INFO -      org.apache.cxf.jaxrs.provider.BinaryDataProvider@49a64d82
+INFO -      org.apache.cxf.jaxrs.provider.DataSourceProvider@344561e0
+INFO - Using exception mappers:
+INFO -      org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@4d9d1b69
+INFO -      org.apache.openejb.server.cxf.rs.EJBExceptionMapper@5305c37d
+INFO -      org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@52c8295b
+INFO -      org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@251f7d26
+INFO - REST Application: http://127.0.0.1:4204/test/api       -> org.superbiz.JAXRSApplication@77b21474
+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 -              POST http://127.0.0.1:4204/test/api/users ->      User addUser(User)
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest)
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-custom-serializer/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.31 sec
+
+Results :
+
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
+    
+....
+
+=== Inside the jar
+
+javaee-api:8.0 brings in all the dependencies needed to spin up a
+working REST application.
+
+If we look at the jar built by maven, we’ll see the application itself
+is quite small:
+
+....
+$ jar tvf target/jsonb-custom-serializer-8.0.0-SNAPSHOT.war 
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/
+   134 Sat Dec 29 19:10:42 CET 2018 META-INF/MANIFEST.MF
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/model/
+     0 Sat Dec 29 19:10:42 CET 2018 WEB-INF/classes/org/superbiz/rest/
+   790 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/model/Address.class
+  2093 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/model/User.class
+  2063 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/UserDeserializer.class
+   402 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/JAXRSApplication.class
+  1461 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/AddressSerializer.class
+  1498 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/rest/UserService.class
+  1549 Sat Dec 29 19:10:38 CET 2018 WEB-INF/classes/org/superbiz/JSONBConfiguration.class
+  1241 Sat Dec 29 17:52:48 CET 2018 WEB-INF/web.xml
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/org.superbiz/
+     0 Sat Dec 29 19:10:44 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/
+  1811 Sat Dec 29 17:53:36 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/pom.xml
+   132 Sat Dec 29 19:10:42 CET 2018 META-INF/maven/org.superbiz/jsonb-custom-serializer/pom.properties
+....
+
+This single jar could be deployed any any compliant Java EE

Review comment:
       ```suggestion
   Esse simples jar poderia ser implantado em qualquer implementação Java EE compliant
   ```




----------------------------------------------------------------
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