You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2020/07/05 01:39:46 UTC
svn commit: r1879513 [4/24] - in /tomee/site/trunk/content: ./
jakartaee-8.0/javadoc/java/ jakartaee-8.0/javadoc/javax/ws/
jakartaee-8.0/javadoc/org/ latest/es/examples/
latest/javadoc/org/apache/tomee/microprofile/config/ latest/pt/examples/
master/es...
Added: tomee/site/trunk/content/latest/pt/examples/jsonb-configuration.html
URL: http://svn.apache.org/viewvc/tomee/site/trunk/content/latest/pt/examples/jsonb-configuration.html?rev=1879513&view=auto
==============================================================================
--- tomee/site/trunk/content/latest/pt/examples/jsonb-configuration.html (added)
+++ tomee/site/trunk/content/latest/pt/examples/jsonb-configuration.html Sun Jul 5 01:39:45 2020
@@ -0,0 +1,513 @@
+<!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>Configuração JSON-B</h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+
+ <div class="col-md-12">
+ <div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>Este exemplo mostra como customizar jsonb para uma aplicaçao JAX-RS.
+JSONB é o novo padrão javaee-api: 8.0 para json serialização/desserialização.
+São necessárias poucas anotações e o JsonbConfig oferece muitas configurações.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_executando_e_testando_o_endpoint">Executando e testando o Endpoint</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>O aplicativo pode ser executado com `mvn clean install tomee:run' se a porta
+8080 está disponÃvel, você pode chamar o seguinte terminal:(GET)
+<a href="http://localhost:8080/jsonb-configuration/api/users" class="bare">http://localhost:8080/jsonb-configuration/api/users</a> que deve responder com o seguinte json:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>[
+ {
+ "Id":1,
+ "Name":"user 1",
+ "Registration":"2018-12-28"
+ },
+ {
+ "Id":2,
+ "Name":"user 2",
+ "Registration":"2018-12-28"
+ }
+]</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="__applicationpath">@ApplicationPath</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Classe de ponto de entrada JAXRS, da seguinte maneira jaxrs carregará todas as classes e métodos @Path anotados sem especificá-los.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_recurso_path_rest">Recurso @Path Rest</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Classe jaxrs simples com um endpoint GET</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Stateless;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.superbiz.model.User;
+
+@Path("users")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Stateless
+public class UserService {
+
+ @GET
+ public List<User> users() {
+ List<User> users = new ArrayList<>();
+ User user1 = new User(1, "user 1");
+ User user2 = new User(2, "user 2");
+ users.add(user1);
+ users.add(user2);
+
+ return users;
+ }
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_configuração_jsonb">Configuração JSONB</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Implementando ContextResolver<>, você pode personalizar os padrões jaxrs; neste exemplo, vamos personalizar a serialização/desserialização JSONB</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.config.PropertyNamingStrategy;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class JSONBConfiguration implements ContextResolver<Jsonb> {
+
+ private Jsonb jsonb;
+
+ public JSONBConfiguration() {
+ // jsonbConfig oferece muitas configurações.
+ JsonbConfig config = new JsonbConfig().withFormatting(true)
+ .withPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)
+ .withDateFormat("yyyy - MM - dd", Locale.ENGLISH);
+
+ jsonb = JsonbBuilder.create(config);
+ }
+
+ @Override
+ public Jsonb getContext(Class<?> type) {
+ return jsonb;
+ }
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_acessando_o_endpoint_rest">Acessando o endpoint rest</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>O teste gera uma aplicação web openejb e chama o endpoint do usuário</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.superbiz.JAXRSApplication;
+import org.superbiz.JSONBConfiguration;
+
+@EnableServices(value = "jaxrs")
+@RunWith(ApplicationComposer.class)
+public class UserServiceTest {
+
+ @Module
+ @Classes({ UserService.class, JAXRSApplication.class, JSONBConfiguration.class })
+ public WebApp app() {
+ return new WebApp().contextRoot("test");
+ }
+
+ @Test
+ public void get() throws IOException {
+ final String message = WebClient.create("http://localhost:4204").path("/test/api/users").get(String.class);
+ System.out.println(message);
+
+ final SimpleDateFormat sdf = new SimpleDateFormat("yyyy - MM - dd");
+
+ // teste withDateFormat("yyyy - MM - dd")
+ Assert.assertTrue(message.contains(sdf.format(new Date())));
+ // teste withFormatting(true)
+ Assert.assertTrue(message.contains(System.getProperty("line.separator")));
+ }
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_executando">Executando</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executado no diretório `jsonb-configuration'.</p>
+</div>
+<div class="paragraph">
+<p>Ao executar, você verá uma saÃda semelhante à seguinte.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>-------------------------------------------------------
+ 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-configuration/UserServiceTest
+INFO - Auto-deploying ejb UserService: EjbDeployment(deployment-id=UserService)
+INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
+INFO - Auto-creating a container for bean org.superbiz.rest.UserServiceTest: Container(type=MANAGED, id=Default Managed Container)
+INFO - Creating Container(id=Default Managed Container)
+INFO - Using directory /tmp for stateful session passivation
+INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
+INFO - Auto-creating a container for bean UserService: Container(type=STATELESS, id=Default Stateless Container)
+INFO - Creating Container(id=Default Stateless Container)
+INFO - Enterprise application "/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-configuration/UserServiceTest" loaded.
+INFO - Creating dedicated application classloader for UserServiceTest
+INFO - Assembling app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-configuration/UserServiceTest
+INFO - Jndi(name=UserServiceLocalBean) --> Ejb(deployment-id=UserService)
+INFO - Jndi(name=global/test/UserService!org.superbiz.rest.UserService) --> Ejb(deployment-id=UserService)
+INFO - Jndi(name=global/test/UserService) --> Ejb(deployment-id=UserService)
+INFO - Created Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container)
+INFO - Started Ejb(deployment-id=UserService, ejb-name=UserService, container=Default Stateless Container)
+INFO - Using readers:
+INFO - org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@2f94c4db
+INFO - org.apache.cxf.jaxrs.provider.FormEncodingProvider@6b5966e1
+INFO - org.apache.cxf.jaxrs.provider.MultipartProvider@65e61854
+INFO - org.apache.cxf.jaxrs.provider.SourceProvider@1568159
+INFO - org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@4fcee388
+INFO - org.apache.cxf.jaxrs.provider.JAXBElementProvider@6f80fafe
+INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@63cd604c
+INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@593e824f
+INFO - org.apache.cxf.jaxrs.provider.StringTextProvider@72ccd81a
+INFO - org.apache.cxf.jaxrs.provider.BinaryDataProvider@6d8792db
+INFO - org.apache.cxf.jaxrs.provider.DataSourceProvider@64bc21ac
+INFO - Using writers:
+INFO - org.apache.johnzon.jaxrs.WadlDocumentMessageBodyWriter@493dfb8e
+INFO - org.apache.cxf.jaxrs.nio.NioMessageBodyWriter@5d25e6bb
+INFO - org.apache.cxf.jaxrs.provider.StringTextProvider@72ccd81a
+INFO - org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider@4fcee388
+INFO - org.apache.cxf.jaxrs.provider.PrimitiveTextProvider@2f94c4db
+INFO - org.apache.cxf.jaxrs.provider.FormEncodingProvider@6b5966e1
+INFO - org.apache.cxf.jaxrs.provider.MultipartProvider@65e61854
+INFO - org.apache.cxf.jaxrs.provider.SourceProvider@1568159
+INFO - org.apache.cxf.jaxrs.provider.JAXBElementProvider@6f80fafe
+INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider@63cd604c
+INFO - org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider@593e824f
+INFO - org.apache.cxf.jaxrs.provider.BinaryDataProvider@6d8792db
+INFO - org.apache.cxf.jaxrs.provider.DataSourceProvider@64bc21ac
+INFO - Using exception mappers:
+INFO - org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper@361c294e
+INFO - org.apache.openejb.server.cxf.rs.EJBExceptionMapper@6fff253c
+INFO - org.apache.cxf.jaxrs.validation.ValidationExceptionMapper@7859e786
+INFO - org.apache.openejb.server.cxf.rs.CxfRsHttpListener$CxfResponseValidationExceptionMapper@285d851a
+INFO - REST Application: http://127.0.0.1:4204/test/api -> org.superbiz.JAXRSApplication@5af28b27
+INFO - Service URI: http://127.0.0.1:4204/test/api/users -> EJB org.superbiz.rest.UserService
+INFO - GET http://127.0.0.1:4204/test/api/users -> List<User> users()
+INFO - Deployed Application(path=/home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-configuration/UserServiceTest)
+[
+ {
+ "Id":1,
+ "Name":"user 1",
+ "Registration":"2018 - 12 - 28"
+ },
+ {
+ "Id":2,
+ "Name":"user 2",
+ "Registration":"2018 - 12 - 28"
+ }
+]
+INFO - Undeploying app: /home/federico/Documents/PRIVATO/Apache/tomee/examples/jsonb-configuration/UserServiceTest
+INFO - Stopping network services
+INFO - Stopping server services
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.203 sec
+
+Results :
+
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0</pre>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_dentro_do_jar">Dentro do jar</h3>
+<div class="paragraph">
+<p>javaee-api:8.0 traz todas as dependências necessárias para iniciar
+um aplicativo REST que esteja funcionando.</p>
+</div>
+<div class="paragraph">
+<p>Se olharmos para o jar construÃdo por maven, veremos que o aplicativo em si é bem pequeno:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>$ jar tvf target/jsonb-configuration-8.0.0-SNAPSHOT.war
+ 0 Fri Dec 28 19:36:10 CET 2018 META-INF/
+ 134 Fri Dec 28 19:36:08 CET 2018 META-INF/MANIFEST.MF
+ 0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/
+ 0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/
+ 0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/org/
+ 0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/org/superbiz/
+ 0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/org/superbiz/model/
+ 0 Fri Dec 28 19:36:08 CET 2018 WEB-INF/classes/org/superbiz/rest/
+ 1165 Fri Dec 28 19:36:06 CET 2018 WEB-INF/classes/org/superbiz/model/User.class
+ 402 Fri Dec 28 19:36:06 CET 2018 WEB-INF/classes/org/superbiz/JAXRSApplication.class
+ 1194 Fri Dec 28 19:36:06 CET 2018 WEB-INF/classes/org/superbiz/rest/UserService.class
+ 1701 Fri Dec 28 19:36:06 CET 2018 WEB-INF/classes/org/superbiz/JSONBConfiguration.class
+ 1224 Fri Dec 28 18:28:32 CET 2018 WEB-INF/web.xml
+ 0 Fri Dec 28 19:36:10 CET 2018 META-INF/maven/
+ 0 Fri Dec 28 19:36:10 CET 2018 META-INF/maven/org.superbiz/
+ 0 Fri Dec 28 19:36:10 CET 2018 META-INF/maven/org.superbiz/jsonb-configuration/
+ 1791 Fri Dec 28 19:10:44 CET 2018 META-INF/maven/org.superbiz/jsonb-configuration/pom.xml
+ 128 Fri Dec 28 19:36:08 CET 2018 META-INF/maven/org.superbiz/jsonb-configuration/pom.properties</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Esse jar único pode ser implantado em qualquer Java EE compatÃvel implementação. No TomEE, basta colocá-lo no diretório <code>tomee.home/webapps/</code>.</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 © 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>
+
Added: tomee/site/trunk/content/latest/pt/examples/jsonb-custom-serializer.html
URL: http://svn.apache.org/viewvc/tomee/site/trunk/content/latest/pt/examples/jsonb-custom-serializer.html?rev=1879513&view=auto
==============================================================================
--- tomee/site/trunk/content/latest/pt/examples/jsonb-custom-serializer.html (added)
+++ tomee/site/trunk/content/latest/pt/examples/jsonb-custom-serializer.html Sun Jul 5 01:39:45 2020
@@ -0,0 +1,723 @@
+<!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>Serializador personalizado JSON-B</h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+
+ <div class="col-md-12">
+ <div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>Este exemplo mostra como personalizar a serialização/desserialização de objetos com jsonb para um aplicativo JAX-RS.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_executando_e_testando_o_endpoint">Executando e testando o Endpoint</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>A Aplicação pode ser executado com `mvn clean install tomee:run' se porta
+8080 está disponÃvel, você pode invocar o seguinte endpoint: (GET)
+<a href="http://localhost:8080/jsonb-custom-serializer/api/users" class="bare">http://localhost:8080/jsonb-custom-serializer/api/users</a> que deve responder com o seguinte json:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>[
+ {
+ "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"
+ }
+]</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>e o endpoint: (POST)
+<a href="http://localhost:8080/jsonb-custom-serializer/api/users" class="bare">http://localhost:8080/jsonb-custom-serializer/api/users</a> com um corpo como:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>{
+ "id": 1,
+ "name": "name1",
+ "extra": "extra1"
+}</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>que respondem com o seguinte json:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>{
+ "id": 1,
+ "name": "name1extra1",
+ "registration": "Sat Dec 29 19:48:05 CET 2018",
+ "address": null
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="__applicationpath">@ApplicationPath</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Classe JAXRS de ponto de entrada, da seguinte maneira, o jaxrs carregará todas as classes e métodos anotados com @Path sem especificá-los.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("api")
+public class JAXRSApplication extends Application {
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_recurso_path_rest">Recurso @Path Rest</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Classe jaxrs simples com um endpoint GET e um POST</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>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;
+ }
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_configuração_jsonb">Configuração JSONB</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>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</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>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;
+ }
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_address_serializer">Address serializer</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Classe serializadora de objetos simples que adiciona <code>modified</code> durante a serialização</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>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);
+ }
+
+ }
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_user_deserializer">User Deserializer</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Cria um objeto a partir de um json</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>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;
+ }
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_usando_o_desserializador_jsonbtypedeserializer_jsonbtypeserializer">Usando o desserializador @JsonbTypeDeserializer @JsonbTypeSerializer</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Com a anotação @JsonbTypeDeserializer ou @JsonbTypeSerializer, você pode notificar o jsonb para usar o desserializador personalizado</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>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
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_acessando_o_endpoint_rest">Acessando o endpoint rest</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>O teste gera um aplicativo da web openejb e chama o endpoint do usuário</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>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"));
+ }
+
+}</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_executando">Executando</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install', executada no diretório `jsonb-custom-serializer'.</p>
+</div>
+<div class="paragraph">
+<p>Ao executar, você verá uma saÃda semelhante à seguinte.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>-------------------------------------------------------
+ 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</pre>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_dentro_do_jar">Dentro do jar</h3>
+<div class="paragraph">
+<p>javaee-api:8.0 traz todas as dependências necessárias para iniciar uma aplicação REST funcionando.</p>
+</div>
+<div class="paragraph">
+<p>Se olharmos para o jar construÃdo pelo maven, veremos que a aplicação:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>$ 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</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Esse simples jar poderia ser implantado em qualquer implementação Java EE compliant.
+No TomEE você simplesmente colocaria-o no diretório <code>tomee.home/webapps/</code> .</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 © 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>
+
Added: tomee/site/trunk/content/latest/pt/examples/moviefun-rest.html
URL: http://svn.apache.org/viewvc/tomee/site/trunk/content/latest/pt/examples/moviefun-rest.html?rev=1879513&view=auto
==============================================================================
--- tomee/site/trunk/content/latest/pt/examples/moviefun-rest.html (added)
+++ tomee/site/trunk/content/latest/pt/examples/moviefun-rest.html Sun Jul 5 01:39:45 2020
@@ -0,0 +1,619 @@
+<!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>MovieFun REST</h1>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+
+ <div class="col-md-12">
+ <div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>Este exemplo mostra o CRUD de um aplicativo engraçado para filmes.
+O web client é construÃdo usando o backbone e o back-end é construÃdo com
+JAX-RS, JPA para a persistência em um banco de dados H2.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_o_código">O código</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_applicationconfig">ApplicationConfig</h3>
+<div class="paragraph">
+<p>Aqui, use anotações JAX-RS para criar recursos.
+@ApplicationPath identifica o caminho do aplicativo que serve como o URI base para todos os recursos.
+A implementação do método getClasses será chamada pela estrutura JAX-RS para obter informações sobre este aplicativo. No exemplo a seguir, ele define dois recursos: LoadRest e MoviesRest.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>package org.superbiz.moviefun.rest;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+@ApplicationPath("/rest")
+public class ApplicationConfig extends Application {
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public Set<Class<?>> getClasses() {
+ return new HashSet<Class<?>>(Arrays.asList(LoadRest.class, MoviesRest.class));
+ }
+}</pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_loadrest">LoadRest</h3>
+<div class="paragraph">
+<p>à um POJO que é mapeado para um URL raiz (<code>load</code>) com o anotação @Path e possui métodos Java para servir solicitações a este URL raiz e seus sub-URLs. Nesse caso, só tem uma solicitação POST onde usa um EJB (MoviesBean) injetado na sua classe para fazer um carregamento inicial de dados no banco de dados.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>package org.superbiz.moviefun.rest;
+
+import org.superbiz.moviefun.Movie;
+import org.superbiz.moviefun.MoviesBean;
+
+import javax.ejb.EJB;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+@Path("load")
+public class LoadRest {
+ @EJB
+ private MoviesBean moviesBean;
+
+ @POST
+ public void load() {
+ moviesBean.addMovie(new Movie("Wedding Crashers", "David Dobkin", "Comedy", 7, 2005));
+ moviesBean.addMovie(new Movie("Starsky & Hutch", "Todd Phillips", "Action", 6, 2004));
+ moviesBean.addMovie(new Movie("Shanghai Knights", "David Dobkin", "Action", 6, 2003));
+ moviesBean.addMovie(new Movie("I-Spy", "Betty Thomas", "Adventure", 5, 2002));
+ moviesBean.addMovie(new Movie("The Royal Tenenbaums", "Wes Anderson", "Comedy", 8, 2001));
+ moviesBean.addMovie(new Movie("Zoolander", "Ben Stiller", "Comedy", 6, 2001));
+ moviesBean.addMovie(new Movie("Shanghai Noon", "Tom Dey", "Comedy", 7, 2000));
+ }
+
+}</pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_movierest">MovieRest</h3>
+<div class="paragraph">
+<p>à um POJO que é mapeado para um URL raiz (<code>filmes</code>) com o anotação @Path e possui métodos Java para veicular solicitações de filmes de entidades no formato JSON de acordo com a anotação @Produces. Aqui tem um método para cada método HTTP (GET, POST, PUT, DELETE).</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>package org.superbiz.moviefun.rest;
+
+import org.superbiz.moviefun.Movie;
+import org.superbiz.moviefun.MoviesBean;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import java.util.List;
+
+@Path("movies")
+@Produces({"application/json"})
+public class MoviesRest {
+
+ @EJB
+ private MoviesBean service;
+
+ @GET
+ @Path("{id}")
+ public Movie find(@PathParam("id") Long id) {
+ return service.find(id);
+ }
+
+ @GET
+ public List<Movie> getMovies(@QueryParam("first") Integer first, @QueryParam("max") Integer max,
+ @QueryParam("field") String field, @QueryParam("searchTerm") String searchTerm) {
+ return service.getMovies(first, max, field, searchTerm);
+ }
+
+ @POST
+ @Consumes("application/json")
+ public Movie addMovie(Movie movie) {
+ service.addMovie(movie);
+ return movie;
+ }
+
+ @PUT
+ @Path("{id}")
+ @Consumes("application/json")
+ public Movie editMovie(Movie movie) {
+ service.editMovie(movie);
+ return movie;
+ }
+
+ @DELETE
+ @Path("{id}")
+ public void deleteMovie(@PathParam("id") long id) {
+ service.deleteMovie(id);
+ }
+
+ @GET
+ @Path("count")
+ @Produces(MediaType.TEXT_PLAIN)
+ public int count(@QueryParam("field") String field, @QueryParam("searchTerm") String searchTerm) {
+ return service.count(field, searchTerm);
+ }
+
+}</pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_movie">Movie</h3>
+<div class="paragraph">
+<p>Essa é a entidade Movie que será persistida pela JPA.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>package org.superbiz.moviefun;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@Entity
+@XmlRootElement(name = "movie")
+public class Movie {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+ private String director;
+ private String title;
+ private int year;
+ private String genre;
+ private int rating;
+
+ public Movie() {
+ }
+
+ public Movie(String title, String director, String genre, int rating, int year) {
+ this.director = director;
+ this.title = title;
+ this.year = year;
+ this.genre = genre;
+ this.rating = rating;
+ }
+
+ public Movie(String director, String title, int year) {
+ this.director = director;
+ this.title = title;
+ this.year = year;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public int getYear() {
+ return year;
+ }
+
+ public void setYear(int year) {
+ this.year = year;
+ }
+
+ public String getGenre() {
+ return genre;
+ }
+
+ public void setGenre(String genre) {
+ this.genre = genre;
+ }
+
+ public int getRating() {
+ return rating;
+ }
+
+ public void setRating(int rating) {
+ this.rating = rating;
+ }
+}</pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_moviesbean">MoviesBean</h3>
+<div class="paragraph">
+<p>Este é o EJB de acordo com a anotação @Stateless. Ele usa a persistência da unidade <code>movie-unit</code> para persistir persistir entidades de filmes.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>package org.superbiz.moviefun;
+
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Path;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.EntityType;
+import java.util.List;
+
+@Stateless
+public class MoviesBean {
+
+ @PersistenceContext(unitName = "movie-unit")
+ private EntityManager entityManager;
+
+ public Movie find(Long id) {
+ return entityManager.find(Movie.class, id);
+ }
+
+ public void addMovie(Movie movie) {
+ entityManager.persist(movie);
+ }
+
+ public void editMovie(Movie movie) {
+ entityManager.merge(movie);
+ }
+
+ public void deleteMovie(long id) {
+ Movie movie = entityManager.find(Movie.class, id);
+ entityManager.remove(movie);
+ }
+
+ public List<Movie> getMovies(Integer firstResult, Integer maxResults, String field, String searchTerm) {
+ CriteriaBuilder qb = entityManager.getCriteriaBuilder();
+ CriteriaQuery<Movie> cq = qb.createQuery(Movie.class);
+ Root<Movie> root = cq.from(Movie.class);
+ EntityType<Movie> type = entityManager.getMetamodel().entity(Movie.class);
+ if (field != null && searchTerm != null && !"".equals(field.trim()) && !"".equals(searchTerm.trim())) {
+ Path<String> path = root.get(type.getDeclaredSingularAttribute(field.trim(), String.class));
+ Predicate condition = qb.like(path, "%" + searchTerm.trim() + "%");
+ cq.where(condition);
+ }
+ TypedQuery<Movie> q = entityManager.createQuery(cq);
+ if (maxResults != null) {
+ q.setMaxResults(maxResults);
+ }
+ if (firstResult != null) {
+ q.setFirstResult(firstResult);
+ }
+ return q.getResultList();
+ }
+
+ public int count(String field, String searchTerm) {
+ CriteriaBuilder qb = entityManager.getCriteriaBuilder();
+ CriteriaQuery<Long> cq = qb.createQuery(Long.class);
+ Root<Movie> root = cq.from(Movie.class);
+ EntityType<Movie> type = entityManager.getMetamodel().entity(Movie.class);
+ cq.select(qb.count(root));
+ if (field != null && searchTerm != null && !"".equals(field.trim()) && !"".equals(searchTerm.trim())) {
+ Path<String> path = root.get(type.getDeclaredSingularAttribute(field.trim(), String.class));
+ Predicate condition = qb.like(path, "%" + searchTerm.trim() + "%");
+ cq.where(condition);
+ }
+ return entityManager.createQuery(cq).getSingleResult().intValue();
+ }
+
+ public void clean() {
+ entityManager.createQuery("delete from Movie").executeUpdate();
+ }
+}</pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_executando">Executando</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>A execução do exemplo é bastante simples. No diretório <code>moviefun-rest</code> execute:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>$ mvn clean install</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>O que deve criar uma saÃda como a seguir.</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>INFO: OpenJPA dynamically loaded a validation provider.
+Dec 18, 2018 1:31:44 PM org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory createDelegate
+INFO: PersistenceUnit(name=movie-unit, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 36ms
+Dec 18, 2018 1:31:44 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=MoviesBeanLocalBean) --> Ejb(deployment-id=MoviesBean)
+Dec 18, 2018 1:31:44 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/test/MoviesBean!org.superbiz.moviefun.MoviesBean) --> Ejb(deployment-id=MoviesBean)
+Dec 18, 2018 1:31:44 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/test/MoviesBean) --> Ejb(deployment-id=MoviesBean)
+Dec 18, 2018 1:31:44 PM org.apache.openejb.util.LogStreamAsync run
+INFO: Existing thread singleton service in SystemInstance(): org.apache.openejb.cdi.ThreadSingletonServiceImpl@94f6bfb
+Dec 18, 2018 1:31:44 PM org.apache.openejb.cdi.ManagedSecurityService <init>
+INFO: Some Principal APIs could not be loaded: org.eclipse.microprofile.jwt.JsonWebToken out of org.eclipse.microprofile.jwt.JsonWebToken not found
+Dec 18, 2018 1:31:44 PM org.apache.openejb.util.LogStreamAsync run
+INFO: OpenWebBeans Container is starting...
+Dec 18, 2018 1:31:44 PM org.apache.webbeans.plugins.PluginLoader startUp
+INFO: Adding OpenWebBeansPlugin : [CdiPlugin]
+Dec 18, 2018 1:31:44 PM org.apache.openejb.cdi.CdiScanner handleBda
+INFO: Using annotated mode for file:/Users/josediaz/Projects/tomitribe/tomee/examples/moviefun-rest/target/arquillian-test-working-dir/0/test/WEB-INF/classes/ looking all classes to find CDI beans, maybe think to add a beans.xml if not there or add the jar to exclusions.list
+Dec 18, 2018 1:31:44 PM org.apache.webbeans.config.BeansDeployer validateInjectionPoints
+INFO: All injection points were validated successfully.
+Dec 18, 2018 1:31:44 PM org.apache.openejb.util.LogStreamAsync run
+INFO: OpenWebBeans Container has started, it took 466 ms.
+Dec 18, 2018 1:31:44 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Created Ejb(deployment-id=MoviesBean, ejb-name=MoviesBean, container=Default Stateless Container)
+Dec 18, 2018 1:31:44 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Started Ejb(deployment-id=MoviesBean, ejb-name=MoviesBean, container=Default Stateless Container)
+Dec 18, 2018 1:31:45 PM org.apache.openejb.assembler.classic.Assembler createApplication
+INFO: Deployed Application(path=/Users/josediaz/Projects/tomitribe/tomee/examples/moviefun-rest/target/arquillian-test-working-dir/0/test)
+Dec 18, 2018 1:31:45 PM org.apache.myfaces.ee.MyFacesContainerInitializer onStartup
+INFO: Using org.apache.myfaces.ee.MyFacesContainerInitializer
+Dec 18, 2018 1:31:45 PM org.apache.myfaces.ee.MyFacesContainerInitializer onStartup
+INFO: Added FacesServlet with mappings=[/faces/*, *.jsf, *.faces, *.xhtml]
+Dec 18, 2018 1:31:45 PM org.apache.jasper.servlet.TldScanner scanJars
+INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
+Dec 18, 2018 1:31:45 PM org.apache.tomee.myfaces.TomEEMyFacesContainerInitializer addListener
+INFO: Installing <listener>org.apache.myfaces.webapp.StartupServletContextListener</listener>
+Dec 18, 2018 1:31:45 PM org.apache.myfaces.config.DefaultFacesConfigurationProvider getStandardFacesConfig
+INFO: Reading standard config META-INF/standard-faces-config.xml
+Dec 18, 2018 1:31:46 PM org.apache.myfaces.config.DefaultFacesConfigurationProvider getClassloaderFacesConfig
+INFO: Reading config : jar:file:/Users/josediaz/.m2/repository/org/apache/openwebbeans/openwebbeans-el22/2.0.8/openwebbeans-el22-2.0.8.jar!/META-INF/faces-config.xml
+Dec 18, 2018 1:31:46 PM org.apache.myfaces.config.DefaultFacesConfigurationProvider getClassloaderFacesConfig
+INFO: Reading config : jar:file:/Users/josediaz/.m2/repository/org/apache/openwebbeans/openwebbeans-jsf/2.0.8/openwebbeans-jsf-2.0.8.jar!/META-INF/faces-config.xml
+Dec 18, 2018 1:31:46 PM org.apache.myfaces.config.LogMetaInfUtils logArtifact
+INFO: Artifact 'myfaces-api' was found in version '2.3.2' from path 'file:/Users/josediaz/.m2/repository/org/apache/myfaces/core/myfaces-api/2.3.2/myfaces-api-2.3.2.jar'
+Dec 18, 2018 1:31:46 PM org.apache.myfaces.config.LogMetaInfUtils logArtifact
+INFO: Artifact 'myfaces-impl' was found in version '2.3.2' from path 'file:/Users/josediaz/.m2/repository/org/apache/myfaces/core/myfaces-impl/2.3.2/myfaces-impl-2.3.2.jar'
+Dec 18, 2018 1:31:46 PM org.apache.myfaces.util.ExternalSpecifications isCDIAvailable
+INFO: MyFaces CDI support enabled
+Dec 18, 2018 1:31:46 PM org.apache.myfaces.spi.impl.DefaultInjectionProviderFactory getInjectionProvider
+INFO: Using InjectionProvider org.apache.myfaces.spi.impl.CDIAnnotationDelegateInjectionProvider
+Dec 18, 2018 1:31:47 PM org.apache.myfaces.util.ExternalSpecifications isBeanValidationAvailable
+INFO: MyFaces Bean Validation support enabled
+Dec 18, 2018 1:31:47 PM org.apache.myfaces.application.ApplicationImpl getProjectStage
+INFO: Couldn't discover the current project stage, using Production
+Dec 18, 2018 1:31:47 PM org.apache.myfaces.config.FacesConfigurator handleSerialFactory
+INFO: Serialization provider : class org.apache.myfaces.shared_impl.util.serial.DefaultSerialFactory
+Dec 18, 2018 1:31:47 PM org.apache.myfaces.config.annotation.DefaultLifecycleProviderFactory getLifecycleProvider
+INFO: Using LifecycleProvider org.apache.myfaces.config.annotation.Tomcat7AnnotationLifecycleProvider
+Dec 18, 2018 1:31:47 PM org.apache.myfaces.webapp.AbstractFacesInitializer initFaces
+INFO: ServletContext initialized.
+Dec 18, 2018 1:31:47 PM org.apache.myfaces.view.facelets.ViewPoolProcessor initialize
+INFO: org.apache.myfaces.CACHE_EL_EXPRESSIONS web config parameter is set to "noCache". To enable view pooling this param must be set to "alwaysRecompile". View Pooling disabled.
+Dec 18, 2018 1:31:47 PM org.apache.myfaces.webapp.StartupServletContextListener contextInitialized
+INFO: MyFaces Core has started, it took [1867] ms.
+Dec 18, 2018 1:31:47 PM null
+INFO: Starting OpenJPA 3.0.0
+Dec 18, 2018 1:31:47 PM null
+INFO: Using dictionary class "org.apache.openjpa.jdbc.sql.HSQLDictionary" (HSQL Database Engine 2.3.2 ,HSQL Database Engine Driver 2.3.2).
+Dec 18, 2018 1:31:47 PM null
+INFO: Connected to HSQL Database Engine version 2.2 using JDBC driver HSQL Database Engine Driver version 2.3.2.
+Dec 18, 2018 1:31:53 PM null
+INFO: Creating subclass and redefining methods for "[class org.superbiz.moviefun.Movie]". This means that your application will be less efficient than it would if you ran the OpenJPA enhancer.
+Dec 18, 2018 1:31:54 PM org.apache.openejb.assembler.classic.Assembler destroyApplication
+INFO: Undeploying app: /Users/josediaz/Projects/tomitribe/tomee/examples/moviefun-rest/target/arquillian-test-working-dir/0/test
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 16.77 sec - in org.superbiz.moviefun.MoviesEJBTest
+
+Results :
+
+Tests run: 3, Failures: 0, Errors: 0, Skipped: 0</pre>
+</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 © 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>
+