blob: f51999a5754279c80a09b665166dbd6b1616b6d7 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../favicon.ico">
<link rel="icon" type="image/png" href="../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../css/cardio.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="preloader">
<img src="../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<span>
<img src="../../img/logo-active.png">
</span>
Apache TomEE
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../docs.html">Documentation</a></li>
<li><a href="../../community/index.html">Community</a></li>
<li><a href="../../security/security.html">Security</a></li>
<li><a href="../../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>JSON-B Custom Serializer</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>This examples shows how to customize objects
serialization/deserialization with jsonb for a JAX-RS Application.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_run_and_test_endpoint">Run and test Endpoint</h2>
<div class="sectionbody">
<div class="paragraph">
<p>the application can be run with `mvn clean install tomee:run' if port
8080 is available you can invoke the following endpoint: (GET)
<a href="http://localhost:8080/jsonb-custom-serializer/api/users" class="bare">http://localhost:8080/jsonb-custom-serializer/api/users</a> that should
respond with the following json:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">[
{
"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"
}
]</code></pre>
</div>
</div>
<div class="paragraph">
<p>and the endpoint: (POST)
<a href="http://localhost:8080/jsonb-custom-serializer/api/users" class="bare">http://localhost:8080/jsonb-custom-serializer/api/users</a> with a body
like:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">{
"id": 1,
"name": "name1",
"extra": "extra1"
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>which respond with the following json:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">{
"id": 1,
"name": "name1extra1",
"registration": "Sat Dec 29 19:48:05 CET 2018",
"address": null
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="__applicationpath">@ApplicationPath</h2>
<div class="sectionbody">
<div class="paragraph">
<p>JAXRS entry point class, as follows jaxrs will load all the annotated
@Path classes and methods without specifying them.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;
@ApplicationPath("api")
public class JAXRSApplication extends Application {
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="__path_rest_resource">@Path Rest resource</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Simple jaxrs class with a GET and a POST endpoint</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import java.util.ArrayList;
import java.util.List;
import jakarta.ejb.Stateless;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.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&lt;User&gt; users() {
List&lt;User&gt; users = new ArrayList&lt;&gt;();
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) {
// Just to show the deserialization
return u;
}
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_jsonb_configuration">JSONB Configuration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Implementing ContextResolver&lt;&gt; you can customize jaxrs defaults, in this
example we are going to customize JSONB serialization for all objects of
type Address, defined in AddressSerializer class</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import jakarta.json.bind.Jsonb;
import jakarta.json.bind.JsonbBuilder;
import jakarta.json.bind.JsonbConfig;
import jakarta.ws.rs.ext.ContextResolver;
import jakarta.ws.rs.ext.Provider;
@Provider
public class JSONBConfiguration implements ContextResolver&lt;Jsonb&gt; {
private Jsonb jsonb;
public JSONBConfiguration() {
JsonbConfig config = new JsonbConfig().withFormatting(true).withSerializers(new AddressSerializer());
jsonb = JsonbBuilder.create(config);
}
@Override
public Jsonb getContext(Class&lt;?&gt; type) {
return jsonb;
}
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_address_serializer">Address serializer</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Simple Object serializer class that add `modified' during serialization</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import jakarta.json.bind.serializer.JsonbSerializer;
import jakarta.json.bind.serializer.SerializationContext;
import jakarta.json.stream.JsonGenerator;
import org.superbiz.model.Address;
public class AddressSerializer implements JsonbSerializer&lt;Address&gt; {
@Override
public void serialize(Address obj, JsonGenerator generator, SerializationContext ctx) {
if (obj != null) {
obj.setAddr("modified - " + obj.getAddr());
ctx.serialize(obj, generator);
}
}
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_user_deserializer">User Deserializer</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Create an object from a json</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import java.lang.reflect.Type;
import jakarta.json.JsonObject;
import jakarta.json.bind.serializer.DeserializationContext;
import jakarta.json.bind.serializer.JsonbDeserializer;
import jakarta.json.stream.JsonParser;
import org.superbiz.model.User;
public class UserDeserializer implements JsonbDeserializer&lt;User&gt; {
@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;
}
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_using_the_deserializer_jsonbtypedeserializer_jsonbtypeserializer">Using the deserializer @JsonbTypeDeserializer @JsonbTypeSerializer</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With the annotation @JsonbTypeDeserializer or @JsonbTypeSerializer you
can notify jsonb to use the custom deserializer</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import java.util.Date;
import jakarta.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
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_accessing_the_rest_endpoint">Accessing the rest endpoint</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The test spin up an openejb webapp and invoke the users endpoint</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import java.io.IOException;
import jakarta.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"));
}
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_running">Running</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Running the example can be done from maven with a simple `mvn clean
install' command run from the `jsonb-custom-serializer' directory.</p>
</div>
<div class="paragraph">
<p>When run you should see output similar to the following.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">-------------------------------------------------------
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) --&gt; Ejb(deployment-id=UserService)
INFO - Jndi(name=global/test/UserService!org.superbiz.rest.UserService) --&gt; Ejb(deployment-id=UserService)
INFO - Jndi(name=global/test/UserService) --&gt; 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 -&gt; org.superbiz.JAXRSApplication@285d851a
INFO - Service URI: http://127.0.0.1:4204/test/api/users -&gt; EJB org.superbiz.rest.UserService
INFO - GET http://127.0.0.1:4204/test/api/users -&gt; List&lt;User&gt; users()
INFO - POST http://127.0.0.1:4204/test/api/users -&gt; 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) --&gt; Ejb(deployment-id=UserService)
INFO - Jndi(name=global/test/UserService!org.superbiz.rest.UserService) --&gt; Ejb(deployment-id=UserService)
INFO - Jndi(name=global/test/UserService) --&gt; 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 -&gt; org.superbiz.JAXRSApplication@77b21474
INFO - Service URI: http://127.0.0.1:4204/test/api/users -&gt; EJB org.superbiz.rest.UserService
INFO - GET http://127.0.0.1:4204/test/api/users -&gt; List&lt;User&gt; users()
INFO - POST http://127.0.0.1:4204/test/api/users -&gt; 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</code></pre>
</div>
</div>
<div class="sect2">
<h3 id="_inside_the_jar">Inside the jar</h3>
<div class="paragraph">
<p>javaee-api:8.0 brings in all the dependencies needed to spin up a
working REST application.</p>
</div>
<div class="paragraph">
<p>If we look at the jar built by maven, we’ll see the application itself
is quite small:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">$ 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</code></pre>
</div>
</div>
<div class="paragraph">
<p>This single jar could be deployed any any compliant Java EE
implementation. In TomEE you’d simply place it in the
<code>tomee.home/webapps/</code> directory.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../js/jquery-1.11.1.min.js"></script>
<script src="../../js/owl.carousel.min.js"></script>
<script src="../../js/bootstrap.min.js"></script>
<script src="../../js/wow.min.js"></script>
<script src="../../js/typewriter.js"></script>
<script src="../../js/jquery.onepagenav.js"></script>
<script src="../../js/tree.jquery.js"></script>
<script src="../../js/highlight.pack.js"></script>
<script src="../../js/main.js"></script>
</body>
</html>