tag:blogger.com,1999:blog-85536427372912988412024-03-02T20:47:00.648-05:00Apuntes de Java<strong>Visita <a href="https://goo.gl/Sddcn2">https://bitbucket.org/apuntesdejava/</a>,
<a href="https://goo.gl/uPs0wf">https://github.com/apuntesdejava/</a></strong>
<br>
<strong><a href="http://bit.ly/1EiXl4Y">Free Learning | ¡Un libro gratuito todos los días!</a></strong>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.comBlogger394125tag:blogger.com,1999:blog-8553642737291298841.post-52194607591358041332024-02-24T23:59:00.004-05:002024-02-24T23:59:46.408-05:00¿Cuál IDE debo usar para programar en Java?<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://docs.google.com/drawings/d/e/2PACX-1vSWgN3efatiBbb0whXxp2t55l8F_CTC6IJw2zERZSWbOZdrwdq-iLc-RlDV6UIhXfF8SUMhn1Kvtimz/pub?w=1600&h=900" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="225" src="https://docs.google.com/drawings/d/e/2PACX-1vSWgN3efatiBbb0whXxp2t55l8F_CTC6IJw2zERZSWbOZdrwdq-iLc-RlDV6UIhXfF8SUMhn1Kvtimz/pub?w=1600&h=900" width="400"></a></div>
Cuando comenzamos a programar en Java, quizás uno de los grandes dilemas
es ¿con qué software haremos nuestro programas?
<p></p>
<p>
Escuchamos, nos invitan, nos mencionan, y hasta nos persuaden (creo que no han
llegado a amenazarnos) que debamos usar cierto IDE y no otro (a menos que sea
una política de la empresa)
</p>
<p>
En esta publicación analizaremos qué es y no es un IDE, mencionaremos y
analizaremos los más conocidos, y veremos cuál es el "mejor".
</p>
<br><p><br></p>
<span></span><a href="https://www.apuntesdejava.com/2024/02/cual-ide-debo-usar-para-programar-en.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-42865471064944173022024-01-11T17:01:00.004-05:002024-01-12T13:03:37.762-05:00Roadmap Java Fullstack Developer 2024<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOc9C2Y3xAyooqeNCYpUiWolT45ie7_tVGHmu50s5WHanUleQItEZZYjTka84dIyJBfAcDmCGtN_luyPNKoZ6qHlB_ZqzNVcDtL1M1sUtQGAANLa3enF3bXlgeRubFoSxOc93pSbU_9cnfMLn2m-Z5kTKIvVvBU1NcBhUKW9q6DoBFnCl-1epWFSijU14/s1024/_a973a84c-b018-4557-8ffa-7d8dd1eb8f91.jpeg"
style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"
> width="320"></a>
</div>
<br>
<p>Vuelvo al blog después de tiempo, porque no tenía tiempo 😁</p>
<p>
Esta vez tengo la motivación de desarrollar un roadmap para que cualquier
desarrollador que tenga la intensión de ser un <b>Java Developer</b> pueda
seguir estos niveles.
</p>
<span></span><a href="https://www.apuntesdejava.com/2024/01/roadmap-java-fullstack-developer.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-53060412855110310582023-07-06T13:42:00.003-05:002023-07-06T13:42:22.081-05:00Las redes sociales<div class="separator" style="clear: both; text-align: center;"><a href="https://i.imgur.com/IX29SQJ.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="448" data-original-width="800" height="179" src="https://i.imgur.com/IX29SQJ.jpeg" width="320"></a></div><br><p><br></p><p>Bueno, esto ya se salió de control. </p><p></p><ul style="text-align: left;"><li>Desde que Elon Musk tomó el control de Twitter para hacerlo más libre, solo logró que sea más restringido.</li><li>Ahora Reddit cobra por los subreddit... ya no es libre como lo era.</li><li>Hay redes sociales que de verdad son libres, pero no le dan tanta publicidad.</li><li>Hay redes sociales que son basura y son muy usadas.</li></ul><div>Así que, aquí listaré las redes sociales que he creado y que trataré de tener algún contenido, y claro, que aporten al conocimiento (y de hecho que no tendrán mucha acogida).</div><span></span><a href="https://www.apuntesdejava.com/2023/07/las-redes-sociales.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-11774264822954659132023-04-01T13:24:00.004-05:002023-04-07T00:36:59.699-05:00Conociendo las Expresionas Lambdas: desde lo simple hasta lo avanzado.<div class="separator" style="clear: both; text-align: center;">
width="230">
</div>
<p>
Veamos las expresiones Lambda, desde lo simple hasta lo complejo, para saber
cómo aplicarlo y por qué aplicarlo.
</p>
<br>
<p>Vamos</p>
<span></span><a href="https://www.apuntesdejava.com/2023/04/conociendo-las-expresionas-lambdas.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-27856802088099549022022-11-05T15:40:00.000-05:002022-11-05T15:40:12.270-05:00¿Qué son los :: en Java?<p>
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://docs.google.com/drawings/d/e/2PACX-1vTTdTWsCbY5gL_bkGv72Gvc9Jwq4_ogbLt_I-_6D1v-HUR_OELF1iDIZ-xenJljUp85V-pDinDCRCvX/pub?w=960&h=540" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="113" src="https://docs.google.com/drawings/d/e/2PACX-1vTTdTWsCbY5gL_bkGv72Gvc9Jwq4_ogbLt_I-_6D1v-HUR_OELF1iDIZ-xenJljUp85V-pDinDCRCvX/pub?w=960&h=540" width="200"></a></div><br>¿Vas llevando tiempo programando en Java y de repente encuentras que usan esta
notación?
<p></p>
<pre class="brush:java">String::toUpperCase</pre>
<p>
Y te preguntas ¿Ya parece C++? ¿Qué es eso? ¿Cómo funciona ese <code>::</code>
</p>
<p>Aquí explicaremos un poco de qué trata.</p>
<a href="https://www.apuntesdejava.com/2022/11/que-son-los-en-java.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com3tag:blogger.com,1999:blog-8553642737291298841.post-12180660369676359942022-08-31T18:24:00.001-05:002022-08-31T18:24:09.592-05:00DataSource en Jakarta EE<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://docs.google.com/drawings/d/e/2PACX-1vRfc64Mw7JAY2dnNrWlup38nZ-49x7AAAj454KZjek3ofpSuC3dyJsu54djCzg_WAeeEG7PniLbO3j_/pub?w=1440&h=810" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vRfc64Mw7JAY2dnNrWlup38nZ-49x7AAAj454KZjek3ofpSuC3dyJsu54djCzg_WAeeEG7PniLbO3j_/pub?w=1440&h=810" width="320"></a></div><br>
Para que nuestra aplicación Jakarta EE tenga conexión a la base de datos,
debemos configurar un DataSource. No debemos usar la clase
<a href="https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html" target="_blank"><code>java.sql.DriverManager</code></a>, es decir, la conexión nativa a JDBC, sino, debemos usar lo que ofrece el
servidor Jakarta EE. Aquí mostraremos dos maneras: configurando el DataSource
en la misma aplicación, y configurando en el Servidor Jakarta EE.
<p></p>
<span></span><a href="https://www.apuntesdejava.com/2022/08/datasource-en-jakarta-ee.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-29149627070453335742022-07-15T23:16:00.000-05:002022-07-15T23:16:00.776-05:00JDK Record ¿Lo necesito?<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBcYq9e6CtVwSPf_AYOIF1XxoFvDzsDVjthXrgdU6zb8xVmy1IoC3usbrn5s3xGsH6Q4y7JWKtJ_myWJjEe-U6cwktoyy6eJ-av5cZtZpiOmHDsHRn7L_MwOZeweE3r-n7sdX1i1H_GptVLn9bnPdOWhkQuQ84-1yPv9euteZRClz11KJHP5ui3wR7/s300/Thinking.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="300" data-original-width="292" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBcYq9e6CtVwSPf_AYOIF1XxoFvDzsDVjthXrgdU6zb8xVmy1IoC3usbrn5s3xGsH6Q4y7JWKtJ_myWJjEe-U6cwktoyy6eJ-av5cZtZpiOmHDsHRn7L_MwOZeweE3r-n7sdX1i1H_GptVLn9bnPdOWhkQuQ84-1yPv9euteZRClz11KJHP5ui3wR7/s1600/Thinking.jpg" width="292"></a>
</div>
<br>JEP 395: Records :
<a href="https://openjdk.org/jeps/395" target="_blank">https://openjdk.org/jeps/395</a>.
<p></p>
<p>
Apareció en la versión JDK 14 como preliminar, y ya fue lanzado como oficial
en la versión JDK 16. ¿Para qué es? ¿Para qué sirve? ¿Será peligroso para mis
proyectos? ¿Será más peligroso para mis hijos?. En este artículo examinaremos
hasta qué tan útil puede ser los Records en JDK.
</p>
<a href="https://www.apuntesdejava.com/2022/07/jdk-record-lo-necesito.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-69500065519665026182022-06-21T12:20:00.000-05:002022-06-21T12:20:02.806-05:00Jakarta EE 9 Essentials Archetype<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://docs.google.com/drawings/d/e/2PACX-1vS1F3QuggZKhp8qj29lsYOUekW-qyBq7u3tB09LNAOMtH1oZSeoUwYRmdNopMHv1WqQiiMgutD485fB/pub?w=1440&h=810" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vS1F3QuggZKhp8qj29lsYOUekW-qyBq7u3tB09LNAOMtH1oZSeoUwYRmdNopMHv1WqQiiMgutD485fB/pub?w=1440&h=810" width="320" /></a></div><br />Acabo de publicar mi primer arquetipo a Maven 🎉🎉🎉<p></p><p>Se llama "Jakarta EE 9 Essentials Archetype".</p><p>Permite crear un proyecto básico con las mínimas dependencias, compatible para cualquier servidor Jakarta EE 9. Tiene una nada de dependencias y de plugins, solo lo necesario para que se construya una aplicación Jakarta EE.</p><p><br /></p><ul style="text-align: left;"><li>El sitio web del proyecto:<a href="https://apuntesdejava.github.io/jakartaee9-essentials-archetype/" target="_blank">https://apuntesdejava.github.io/jakartaee9-essentials-archetype/</a></li><li>Detalles del arquetipo en el repositorio central: <a href="https://search.maven.org/artifact/com.apuntesdejava/jakartaee9-essentials/0.1/maven-archetype" target="_blank">https://search.maven.org/artifact/com.apuntesdejava/jakartaee9-essentials/0.1/maven-archetype</a><br /></li></ul><h2>Modo de uso</h2><p>Para crear un proyecto basta con ejecutar el siguiente comando desde la consola desde una carpeta / directorio en blanco:</p><pre class="brush:plain">mvn -DarchetypeGroupId=com.apuntesdejava \
-DarchetypeArtifactId=jakartaee9-essentials \
org.apache.maven.plugins:maven-archetype-plugin:generate
</pre><p><br />Si se ejecuta así, el maven preguntará por el nombre el grupo, del artefacto y del paquete del proyecto a crear.</p><h3 style="text-align: left;">Con NetBeans</h3><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOmcHvCIsRqaC401GnIjHbNUA1uhvmQZ54y1aAkXxaUVzW_Ib4wY88MNpeeUtDASmS5Oz8p5MB5MLd9D2IwqD9Pa3geKOIYTJNcQupBVEfeXR95C697o5qLLTClUQ-dz-n1dieHt26nCuGmvTAzDoQltFnpOOkrVGLxVNxlZs4PBmqCXb2DIW5BswV/s857/netbeans64_srJ03Cnr1E.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="591" data-original-width="857" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOmcHvCIsRqaC401GnIjHbNUA1uhvmQZ54y1aAkXxaUVzW_Ib4wY88MNpeeUtDASmS5Oz8p5MB5MLd9D2IwqD9Pa3geKOIYTJNcQupBVEfeXR95C697o5qLLTClUQ-dz-n1dieHt26nCuGmvTAzDoQltFnpOOkrVGLxVNxlZs4PBmqCXb2DIW5BswV/w400-h276/netbeans64_srJ03Cnr1E.png" width="400" /></a></div><br /><h4 style="text-align: left;">Con IntelliJ</h4><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1xmcYYmQzAq6DKqePaW0EI2FG_bp1IgrT_gK6TQCP8MqJjCJ7SOWHysziWGxXingoVNWl6jUeOtJYQb3xroMhgftjfW6TP-sP2YDAgwEJ1NccBXiVKd89CGCOUTiMFDi_bC_lD0VKLJIdq5LY2EyOk9ouoRHb8MLaEY-Z5Fa3T0x1U6DcDcNRKEGE/s792/idea64_esKasRmecl.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="792" data-original-width="784" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1xmcYYmQzAq6DKqePaW0EI2FG_bp1IgrT_gK6TQCP8MqJjCJ7SOWHysziWGxXingoVNWl6jUeOtJYQb3xroMhgftjfW6TP-sP2YDAgwEJ1NccBXiVKd89CGCOUTiMFDi_bC_lD0VKLJIdq5LY2EyOk9ouoRHb8MLaEY-Z5Fa3T0x1U6DcDcNRKEGE/w396-h400/idea64_esKasRmecl.png" width="396" /></a></div><br /><h4 style="text-align: left;">Con Visual Studio Code</h4><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAU-fpxKRDObIDBCpKsqeYKl6Kf-Y6qTgnKj-j3yybIaQoBfW510K1s2TeR714-_YUiX4U_i_PNAVmtwJiaZsTRq6Uu_zrUUi4NHUp9O1eZLytuYITk3_6oH7M0_eOwzBF9AWjkbSO-MSBRiVs7sJL2R8naL83-pXlqkzPAg_ebYJHHx9QMXNBAANg/s469/Code_Gv6ZcUBr8u.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="166" data-original-width="469" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAU-fpxKRDObIDBCpKsqeYKl6Kf-Y6qTgnKj-j3yybIaQoBfW510K1s2TeR714-_YUiX4U_i_PNAVmtwJiaZsTRq6Uu_zrUUi4NHUp9O1eZLytuYITk3_6oH7M0_eOwzBF9AWjkbSO-MSBRiVs7sJL2R8naL83-pXlqkzPAg_ebYJHHx9QMXNBAANg/s16000/Code_Gv6ZcUBr8u.png" /></a></div><br /><h4 style="text-align: left;">Con Eclipse IDE</h4><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzxCjAg2_VDiZVtvxgfFlXPUIDQLjeKia_pWlvtuw-yyW1ewV0s5NSonVz_F7bEFM3GHZV_v7QEzyGYqi__JIVSYPy288jH2MmRzL5INJo01RIZY1fIcMbEH_Ue6wL6GxJqzvCkZ9Ri968hdoxkpylpmEqLiz7g3-GCKeWj0kHXKpgrmtQIp9CXfOg/s592/eclipse_Ol3tG84h4x.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="542" data-original-width="592" height="366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzxCjAg2_VDiZVtvxgfFlXPUIDQLjeKia_pWlvtuw-yyW1ewV0s5NSonVz_F7bEFM3GHZV_v7QEzyGYqi__JIVSYPy288jH2MmRzL5INJo01RIZY1fIcMbEH_Ue6wL6GxJqzvCkZ9Ri968hdoxkpylpmEqLiz7g3-GCKeWj0kHXKpgrmtQIp9CXfOg/w400-h366/eclipse_Ol3tG84h4x.png" width="400" /></a></div><br /><p><br /></p>
<h2>Motivación</h2><p>En principio, porque cuando creaba un proyecto Jakarta EE usando algún IDE, éste me creaba con muchas dependencias y plugins.</p><p>Otra motivación es porque este proyecto es un anticipo de otro <b>proyecto que estamos desarrollando</b>. Ya lo estaré compartiendo por este medio y por las redes.<br /></p>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-75203326008442018082022-03-28T16:06:00.004-05:002022-04-01T17:50:16.082-05:00Cambiando propiedades de conexión JDBC en Quarkus.... durante ejecución (y en Payara Micro)<p><b></b></p><div class="separator" style="clear: both; text-align: center;"><b><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnU9Gex_yZIfmiXB3Z8whGaQuKny-kCWH0sUOIP8GFRiRNCxJeyAEL6PSH6KuSZP6qkD7urtEMRRuS5q9jC1FqwTBbTyJhcQ693XwpitHQ7nomK8o6arODmCWpR0UNy0lOPjI1sJSxjbtptui4MPi7wLMuDdhLu4Pt8eBTfilzRKU_EWD1cCEm1qGv/s1280/f1280x720-22246_153921_5050.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnU9Gex_yZIfmiXB3Z8whGaQuKny-kCWH0sUOIP8GFRiRNCxJeyAEL6PSH6KuSZP6qkD7urtEMRRuS5q9jC1FqwTBbTyJhcQ693XwpitHQ7nomK8o6arODmCWpR0UNy0lOPjI1sJSxjbtptui4MPi7wLMuDdhLu4Pt8eBTfilzRKU_EWD1cCEm1qGv/s320/f1280x720-22246_153921_5050.jpg" width="320"></a></b></div><b><br>Normalmente</b>, los valores de las conexiones DEBEN estar separado del código (si eres principiante, ya debes saberlo a rajatabla). Y si usamos frameworks como Quarkus, PayaraMicro, OpenLiberty, etc (ah, también Springboot) estos ya tienen preparado características como "perfiles" donde las propiedades pueden establecerse de acuerdo a cada perfil, o también podemos usar los perfiles del Maven para usar tal o cual propiedades. O también podemos hacer que tomen los valores del entorno (variables del entorno donde se está ejecutando, sea test, staging, producción, etc). En fin, podemos configurar los valores de las propiedades <b>ANTES</b> de que se ejecute la aplicación para que funcione tranquilamente. Y así, no pasó nada.<p></p><p>PEROOO!!! Hay veces que el cliente, en su afán de implementar seguridad extrema dice que nada de las credenciales de base de datos puede estar en variables de entorno, ni en las propiedades de despliegue, ni nada. Sino que están en un recurso externo (puede ser un Azure Table Storage, AWS Secret Manager, REST API, en otra base de datos, etc) solo nos dicen "tú consumes este nombre y ahí están las credenciales". Suena comprensible, pero - considerando lo expuesto en el anterior párrafo - no habría manera directa de leer los valores de las credenciales antes de insertar en las propiedades justo antes que termine de ejecutarse la aplicación. Deberíamos interceptar la ejecución de la lectura de las propiedades, o de la creación de la conexión de la base de datos.</p><p>En este post veremos la solución para dos Frameworks: Quarkus y PayaraMicro. Las credenciales serán tomadas de un servicio REST ficticio. La base de datos será H2 para no tener que pensar en configurar un ambiente. Espero que les sea útil</p><p><br></p><span></span><a href="https://www.apuntesdejava.com/2022/03/cambiando-propiedades-de-conexion-jdbc.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-63930393365501767702022-02-04T20:24:00.001-05:002022-02-04T20:24:57.429-05:00Payara + MySQL en contenedores<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://docs.google.com/drawings/d/e/2PACX-1vRh3kq3K3f7GUDAWNIEHd_WCF91SNhBFj9-0i1bthLAnCc7YlqqVV_LDvUgif0dZW5XiQNKhoZ2TN51/pub?w=960&h=540" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vRh3kq3K3f7GUDAWNIEHd_WCF91SNhBFj9-0i1bthLAnCc7YlqqVV_LDvUgif0dZW5XiQNKhoZ2TN51/pub?w=960&h=540" width="320"></a></div><br> Seguimos con la contenedir.. bueno, poniendo todo en contenedores. Ahora, una aplicación que estaba desarrollando en vivo, una aplicación Jakarta EE (con EJB, JPA y JSF) lo he puesto para que, en desarrollo, se pueda ejecutar en un Payara normal del IDE, y que también pueda ejecutarse en contenedores. Aquí explicaré un poco de cómo se logra esto, y un breve repaso a la organización de la aplicación.<p></p><span></span><a href="https://www.apuntesdejava.com/2022/02/payara-mysql-en-contenedores.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-35015813198031198542022-01-28T19:36:00.003-05:002022-01-28T19:36:59.234-05:00OpenJDK + Liferay + MySQL, en contenedores<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://docs.google.com/drawings/d/e/2PACX-1vQUON2B1xFDnuymWBkZWTsyYM2C8O6whJ_x3hhrehqfRiZ8KiZMU_Ar6rzZs8I7gWOtdp5ZbGTL2kD8/pub?w=1440&h=810" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="113" src="https://docs.google.com/drawings/d/e/2PACX-1vQUON2B1xFDnuymWBkZWTsyYM2C8O6whJ_x3hhrehqfRiZ8KiZMU_Ar6rzZs8I7gWOtdp5ZbGTL2kD8/pub?w=1440&h=810" width="200"></a></div>Estamos en el mundo de la <i>contened.. conteneni...contenedoriza</i>... bueno, que todo lo colocan en contenedores. Lo cual es un gran alivio en la configuración y puesta en producción de servidores. No tendríamos de qué preocuparnos más que esté bien configurado a través de un archivo YAML.<p></p><p>Una de los temas más recurrentes que he hablado en este humilde blog es sobre el CMS hecho en Java llamado Liferay. Siempre la parte que más me preocupaba era: ¿cómo diablos podemos ponerlo en producción con algunos pasos?. Pues bueno, aquí lo explico en este post: usando Docker.</p><span></span><a href="https://www.apuntesdejava.com/2022/01/openjdk-liferay-mysql-en-contenedores.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com1tag:blogger.com,1999:blog-8553642737291298841.post-83117186667214946822021-07-12T18:58:00.000-05:002021-07-12T18:58:06.775-05:00Hablemos Java - Primer "En vivo" del blog: Streams, Lambdas y otras cosas más<p>Comenzando una nueva sección: los vídeos en vivo. Para que se vea que no hay truco o trampa, y si hay, que aparezcan en vivo.</p><p>Aquí la primera emisión donde hablamos sobre Streams y Lambdas.</p><p>Si te gusta el contenido y deseas ver más, apóyame con un like y suscribíendote al canal. Estate atento a las siguientes emisiones. Podemos conversar ahí y hasta podríamos resolver problemas juntos.</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/eA6juXsm92Y" width="800" youtube-src-id="eA6juXsm92Y"></iframe></div><br /><p><br /></p>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-28208664803216681702020-12-11T09:00:00.001-05:002020-12-11T09:00:07.257-05:00Quarkus con NetBeans 12<div class="separator" style="clear: both; text-align: center;"><a href="https://docs.google.com/drawings/d/e/2PACX-1vQuKeGq4BNMpqKUD0U_hN1MYSKVAUns1LuDwWq_qP1Bk2x5vimQbbGoMp2oRss4UAg08QJ7d6k8x4s8/pub?w=1440&h=810" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="181" src="https://docs.google.com/drawings/d/e/2PACX-1vQuKeGq4BNMpqKUD0U_hN1MYSKVAUns1LuDwWq_qP1Bk2x5vimQbbGoMp2oRss4UAg08QJ7d6k8x4s8/pub?w=1440&h=810" width="320" /></a></div><br /><p>En este vídeo conoceremos un poco de Quarkus, crear una aplicación MicroProfile, y ejecutarlo desde NetBeans.</p><p> </p><p> </p><p> </p><p> </p><p> </p>
<iframe allowfullscreen="" class="BLOG_video_class" height="375" src="https://www.youtube.com/embed/mMn3U3_Dehk" width="452" youtube-src-id="mMn3U3_Dehk"></iframe>
<p>Luego iremos desarrollando más funcionalidades MicroProfile en este proyecto de Quarkus</p>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-55697095682463698572020-04-09T22:35:00.005-05:002022-01-27T16:09:09.190-05:00Midiendo el rendimiento de rutinas <div class="separator" style="clear: both; text-align: center;"><a href="https://docs.google.com/drawings/d/e/2PACX-1vSwgB10eTI90vEFdB4aQHmnnaGy324JzXQRIuSylrrUHgZfhe7tyIy-eHyGcG2usHkXfm9erpNmKj1-/pub?w=960&h=540" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vSwgB10eTI90vEFdB4aQHmnnaGy324JzXQRIuSylrrUHgZfhe7tyIy-eHyGcG2usHkXfm9erpNmKj1-/pub?w=960&h=540" width="320"></a></div><br><div><br></div><div>Estos días me ha tocado revisar código hecho por otros, y encontré un par de rutinas que me parecieron interesantes para revisar. Estas las publiqué en la cuenta de twitter:</div><blockquote class="twitter-tweet"><p dir="ltr" lang="es"><a href="https://twitter.com/hashtag/CodeReviewChallenge?src=hash&ref_src=twsrc%5Etfw">#CodeReviewChallenge</a><br><br>A ver, cómo optimizarían este código (que encontré)? <a href="https://t.co/PUWZy0erpG">pic.twitter.com/PUWZy0erpG</a></p>— ☕ Apuntes de Java ☕ 😷🏠 (@apuntesdejava) <a href="https://twitter.com/apuntesdejava/status/1247284131513470982?ref_src=twsrc%5Etfw">April 6, 2020</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script> <hr><blockquote class="twitter-tweet"><p dir="ltr" lang="es"><a href="https://twitter.com/hashtag/CodeReviewChallenge?src=hash&ref_src=twsrc%5Etfw">#CodeReviewChallenge</a> <a href="https://twitter.com/hashtag/QuedateEnCasa?src=hash&ref_src=twsrc%5Etfw">#QuedateEnCasa</a> <a href="https://twitter.com/hashtag/StayHome?src=hash&ref_src=twsrc%5Etfw">#StayHome</a> <br>¿Cómo simplificarían el contenido de este método? (sin usar bibliotecas adicionales) <a href="https://t.co/rfRn8Qb2Ga">pic.twitter.com/rfRn8Qb2Ga</a></p>— ☕ Apuntes de Java ☕ 😷🏠 (@apuntesdejava) <a href="https://twitter.com/apuntesdejava/status/1247565151219351559?ref_src=twsrc%5Etfw">April 7, 2020</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script> <hr><div>He recibido respuestas interesantes. <br></div><div><br></div><div>Lo que publicaré en este post y en un vídeo es ver cuál es la rutina más rápida, en base a sus respuestas.</div><span></span><a href="https://www.apuntesdejava.com/2020/04/midiendo-el-rendimiento-de-rutinas.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com3tag:blogger.com,1999:blog-8553642737291298841.post-46941957210077141272020-02-04T11:51:00.001-05:002020-02-04T11:51:51.203-05:00Liferay 7.2. Service Layer + Portlet. Un CRUD básico<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vS9xw2cEtjbvK9hV2JSEATTxi5--5ZA09r3NYjrmu8Ztf3_9-igOogL9omMvIR-7fOk3RV93W7F88bk/pub?w=1440&h=810" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vS9xw2cEtjbvK9hV2JSEATTxi5--5ZA09r3NYjrmu8Ztf3_9-igOogL9omMvIR-7fOk3RV93W7F88bk/pub?w=1440&h=810" width="320"></a></div>
En este post conoceremos cómo implementar un CRUD muy básico, pero consiste en unir el Service layer con el Portlet. Aquí ya unimos las piezas que forman el MVC en Liferay.<br>
<a href="https://www.apuntesdejava.com/2020/02/liferay-72-service-layer-portlet-un.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com2tag:blogger.com,1999:blog-8553642737291298841.post-26129672282696275832019-12-10T17:51:00.000-05:002019-12-10T17:58:15.040-05:00Liferay 7.2. Service Layer - Consultas personalizadas<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vSLY-6cWrne9MeYlKSeIBIekbN77ZfwWb-Lw4JnQSKq8dtwW2Kz2tVo89LCn-tP2T2FsikQ8fEyOp91/pub?w=1440&h=810" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vSLY-6cWrne9MeYlKSeIBIekbN77ZfwWb-Lw4JnQSKq8dtwW2Kz2tVo89LCn-tP2T2FsikQ8fEyOp91/pub?w=1440&h=810" width="320"></a></div>
Hasta el momento hemos creado consultas simples, como listar todos los registros con un campo u otro campo iguales.<br>
<br>
Pero necesitamos que nuestros registros puedan ser leídos con cualquier combinación de los cambios.<br>
<br>
El Service Layer nos cubre grandes funcionalidades con las características básicas del CRUD. Además, podemos agregar otros tipos de consultas. Estos tipos de consulta se llama <code>DynamicQuery</code>, y es lo que veremos en este post.<br>
<a href="https://www.apuntesdejava.com/2019/12/liferay-72-service-layer-consultas.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-84483723634215210922019-12-10T13:45:00.001-05:002019-12-10T14:01:18.011-05:00Presentando MP Lemon BuilderAquí les presento la primera versión de mi aplicación <a href="https://github.com/apuntesdejava/mp-lemon-builder" target="_blank">MP Lemon Builder</a>.<br />
<br />
<h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSaTM9whmP9UO9mTq0ssMucIN2FRNPrwtXWbOmJywim_h3xkq5CfdXCEifTxAqmgaYoLsXoapgo90QaRObsvFS-dGsK5sMDrvKe4lWfc6rqtXyNjolPV-uet3NH6L2-vM-mn2TiY0fG_w/s1600/logo-microprofile-500x500.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="500" data-original-width="500" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSaTM9whmP9UO9mTq0ssMucIN2FRNPrwtXWbOmJywim_h3xkq5CfdXCEifTxAqmgaYoLsXoapgo90QaRObsvFS-dGsK5sMDrvKe4lWfc6rqtXyNjolPV-uet3NH6L2-vM-mn2TiY0fG_w/s200/logo-microprofile-500x500.png" width="200" /></a></div>
¿En qué consiste?</h3>
Es un generador de proyectos MP (MicroProfile), y en esta primera versión permite crear una aplicación asegurada con JWT. La autenticación utilizará el realm del servidor (en esta primera versión utiliza a Payara) y la validación de los roles lo hará utilizando el estándar de JakartaEE.<br />
<br />
Aquí muestro un vídeo de cómo funciona.<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/AafDYt4uF0M" width="480"></iframe>
<br />
<h3>
Fuentes</h3>
Esta aplicación está basada en dos proyectos:
<br />
<ol>
<li>La publicación de Victor Orozco: <a href="https://vorozco.com/blog/2019/2019-10-02-MicroProfile-JWT-Token-Provider-Servlet.html" target="_blank">A simple MicroProfile JWT token provider with Payara realms and JAX-RS</a></li>
<li><a href="http://jwtenizr.sh/" target="_blank">JWT dispenser</a> de <a href="http://www.adam-bien.com/roller/abien/entry/authentication_and_authorization_with_jwt" target="_blank">Adam Bien</a>.</li>
</ol>
<h3>
¿Por qué "Lemon"?</h3>
Porque me gustan las frutas, y el limón es una de mis preferidas.<br />
<br />
<a href="https://imgflip.com/gif/3gdg6k"><img src="https://i.imgflip.com/3gdg6k.gif" title="made at imgflip.com" /></a>
Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-49288508799120119062019-11-06T18:16:00.003-05:002019-11-06T18:20:00.661-05:00Cliente Standalone de JAX-RS (o cualquier endpoint RESTful)<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vTJ5kV7fhzmK-n7ayHEnzOpRyS9LOdFHtkuNN7ePSauowBaSrI6iSvBX3QqW3ehUzN38v9-bfyOXnkv/pub?w=960&h=600" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="500" data-original-width="800" height="200" src="https://docs.google.com/drawings/d/e/2PACX-1vTJ5kV7fhzmK-n7ayHEnzOpRyS9LOdFHtkuNN7ePSauowBaSrI6iSvBX3QqW3ehUzN38v9-bfyOXnkv/pub?w=960&h=600" width="320" /></a></div>
<br />
<br />
Si tenemos una aplicación standalone (puede ser un JavaFX, de línea de comandos, batch, etc) que necesite consumir un endpoint hecho en RESTful, por lo general usaríamos algo como esto:<br />
<br />
<pre class="brush:java">public class RestClient {
private static final String REST_URI
= "http://localhost:8082/spring-jersey/resources/employees";
private Client client = ClientBuilder.newClient();
public Employee getJsonEmployee(int id) {
return client
.target(REST_URI)
.path(String.valueOf(id))
.request(MediaType.APPLICATION_JSON)
.get(Employee.class);
}
//...
}</pre>
<br />
(Tomado de <a href="https://www.baeldung.com/jersey-jax-rs-client">https://www.baeldung.com/jersey-jax-rs-client</a>)<br />
<br />
Lo cual no está mal, pero creo que debería ser lo más transparente posible. ¿Cómo es eso?<br />
Si ven en la línea 13 del código anterior, significa que hay que decirle que haga un <code>GET</code> a la petición, además de pasarle el tipo de respuesta y otras cosas más. La cuestión se volvería algo compleja si queremos hacer otras peticiones como <code>POST</code>, <code>DELETE</code>, etc.<br />
<br />
Pues aquí vengo con una solución que encontré revisando la documentación de JAX-RS.<br />
<br />
<h2>
El servidor</h2>
<div>
Para este ejemplo, he creado un pequeño servidor CRUD en Payara Micro, el cual puedes obtener su código aquí: <a href="https://github.com/apuntesdejava/demo-jaxrs-standalone/tree/master/demo-jaxrs-server">https://github.com/apuntesdejava/demo-jaxrs-standalone/tree/master/demo-jaxrs-server</a></div>
<div>
<br /></div>
<div>
El Endpoint principal es este:</div>
<div>
<pre class="brush:java;first-line:38">
@Path("person")
@Produces(APPLICATION_JSON)
@Consumes(APPLICATION_JSON)
@ApplicationScoped
public class PersonEndpoint {
@Inject
private PersonRepository personRepository;
@POST
public Response create(PersonParam param) {
Person p = personRepository.create(param.getName(), param.getEmail());
return Response.ok(p).build();
}
@GET
public Response list() {
List<Person> list = personRepository.findAll();
return Response.ok(list).build();
}
@DELETE
@Path("{id}")
public Response delete(@PathParam("id")long personId){
personRepository.delete(personId);
return Response.ok().build();
}
}
</pre>
</div>
<div>
<br /></div>
El cual tiene tres métodos principales:<br />
<br />
<ul>
<li><code>@POST</code> <code>create()</code> para insertar registros</li>
<li><code>@GET</code> <code>list()</code> para leer todos los registros</li>
<li><code>@DELETE</code> <code>delete()</code> para borrar un registro</li>
</ul>
Una manera para probarlo es ejecutándolo y llamando desde un cliente:
<br />
<br />
Insertando un registro:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1CZGhlqDh9P86fnOd6PD5h_eMAg4FVBQ9WzqIz3RoY53N5U2nqx88u62aFbUTRP3Kj4SsdAtQG7YQIWie6cwVbQjD_Dn5I_WxMRPgA-QkM214dgH4Jcsb0YEo_iDewc-Te8n7Qiyvg9g/s1600/2019-11-06_17-40-37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="273" data-original-width="705" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1CZGhlqDh9P86fnOd6PD5h_eMAg4FVBQ9WzqIz3RoY53N5U2nqx88u62aFbUTRP3Kj4SsdAtQG7YQIWie6cwVbQjD_Dn5I_WxMRPgA-QkM214dgH4Jcsb0YEo_iDewc-Te8n7Qiyvg9g/s1600/2019-11-06_17-40-37.png" /></a></div>
<br />
Listando los registros:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgonJm_sdGw6ViQVK1iiJkJ5FuCBSCS4Tgj9HaqtwU1r63ITFhPRB7bGhktKnZw_ucL7M1_3D9Nwcj5NAEFdzo5X0bTfxkjqbnm3fqyH0LkkO0w9ohIavrklLGdmYul2D5DAIiygruq_CY/s1600/2019-11-06_17-43-17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="274" data-original-width="554" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgonJm_sdGw6ViQVK1iiJkJ5FuCBSCS4Tgj9HaqtwU1r63ITFhPRB7bGhktKnZw_ucL7M1_3D9Nwcj5NAEFdzo5X0bTfxkjqbnm3fqyH0LkkO0w9ohIavrklLGdmYul2D5DAIiygruq_CY/s1600/2019-11-06_17-43-17.png" /></a></div>
<br />
Borrando ese registro (en mi caso, el 97)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUfe28VLbO91tDvI1c5yRx8cQTaICYuXCxNpOA2jYDSXlDcebeEoQiDfv-UodrITljR8MNfMsnwTJj237VWl5td6exTJORDqpDeTCXaOw_kcMBvIjgCgLra89S02os89g292ZguvXs9N8/s1600/2019-11-06_17-44-30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="220" data-original-width="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUfe28VLbO91tDvI1c5yRx8cQTaICYuXCxNpOA2jYDSXlDcebeEoQiDfv-UodrITljR8MNfMsnwTJj237VWl5td6exTJORDqpDeTCXaOw_kcMBvIjgCgLra89S02os89g292ZguvXs9N8/s1600/2019-11-06_17-44-30.png" /></a></div>
<br />
<h2>
El Cliente</h2>
En el cliente tiene que existir un método que luzca igual que la clase del endpoint servidor para que sea "transparente" la invocación.
<br />
<br />
<pre class="brush:java;first-line:33">
@Path("person")
@Produces(APPLICATION_JSON)
@Consumes(APPLICATION_JSON)
public interface PersonEndpoint {
@POST
Response create(PersonParam param);
@GET
Response list();
@DELETE
@Path("{id}")
Response delete(@PathParam("id") long personId);
}
</pre>
Pero esto tiene un tratamiento muy especial: no es una clase, es una interfaz. Aquí es lo divertido ¿cómo es que lo podrá identificar cada petición? Pues esta es la magia del cliente JAX-RS.<br />
<br />
Hay varios clientes de JAX-RS, algunos son:<br />
<br />
<ul>
<li>RestEasy: https://github.com/resteasy/resteasy-examples/tree/3.6.0.Final/jaxrs-2.0/simple-client</li>
<li>Quarkus: https://quarkus.io/guides/rest-client</li>
<li>Apache CXF: <a href="https://cxf.apache.org/">https://cxf.apache.org/</a></li>
</ul>
<div>
Aquí usaré el Apache CXF. Independientemente puede usarse cualquier implementación, pero seguirá siendo la misma interfaz. Solo cambia cómo se invoca al Endpoint del Cliente.</div>
<div>
<br /></div>
<div>
Así se construye usando Apache CXF:</div>
<pre class="brush:java;first-line:40"> PersonEndpoint client = JAXRSClientFactory.create(
REST_URI,
PersonEndpoint.class,
Arrays.asList(
new JacksonJaxbJsonProvider()
));
</pre>
<br />
Luego, se llama como si fuera cualquier método "local":
<br />
<pre class="brush:java;first-line:48"> PersonParam param = new PersonParam("persona 1", "abc@mail.com"); //creo los parámetros
Response resp = client.create(param); //invoco al endpoint
LOG.log(Level.INFO, "status:{0}", resp.getStatusInfo().getReasonPhrase()); //muestro la respuesta
if (resp.getStatus() == Response.Status.OK.getStatusCode()) { //si está ok...
Person p = resp.readEntity(Person.class); //.. convierto la petición en la entidad que se recibió...
LOG.log(Level.INFO, "-> registro insertado:{0}", p.toString()); //... y muestro el contenido
}
</pre>
<br />
Si deseamos listar, también se haría lo mismo:<br />
<pre class="brush:java;first-line:57"> resp = client.list(); //invocamos el método de listado
LOG.log(Level.INFO, "status:{0}", resp.getStatusInfo().getReasonPhrase()); //mostramos el resultado...
List<Person> list = null; //preparamos nuestra lista que vamos a recibir
if (resp.getStatus() == Response.Status.OK.getStatusCode()) { //evaluamos el contenido... si está OK...
list = resp.readEntity(new GenericType<List<Person>>() { //... convertimos la petición en el listado
});
list.forEach((p) -> { //... y podemos listar el contenido.
LOG.log(Level.INFO, "id:{0}\tname:{1}\temail:{2}", new Object[]{p.getPersonId(), p.getName(), p.getEmail()});
});
}
</pre>
<h2>
Código fuente</h2>
El código fuente para este proyecto se puede encontrar aquí:
<br />
<br />
<ul>
<li><a href="https://github.com/apuntesdejava/demo-jaxrs-standalone">https://github.com/apuntesdejava/demo-jaxrs-standalone</a></li>
<li><a href="https://bitbucket.org/apuntesdejava/demo-jaxrs-standalone/">https://bitbucket.org/apuntesdejava/demo-jaxrs-standalone/</a></li>
</ul>
<div>
<br /></div>
Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-3930114515652468852019-10-12T12:22:00.001-05:002019-10-12T12:27:54.258-05:00Otro tutorial de Java: Sesión 3 - Tipos de variables y cómo nombrarlas<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vRNpdTG7RVNNzTq4g5p3R-JbRflTUUdHV6sfCeODbFE4q0Bxdu1jBbeFkwknmdQMyQ2m48CR9uLC_4z/pub?w=1440&h=810" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vRNpdTG7RVNNzTq4g5p3R-JbRflTUUdHV6sfCeODbFE4q0Bxdu1jBbeFkwknmdQMyQ2m48CR9uLC_4z/pub?w=1440&h=810" width="320"></a></div>
<br>
<br>
Las variables, cuáles son sus tipos, y cómo se deberían declarar.
<br>
<br>
<br>
<br>
<a href="https://www.apuntesdejava.com/2019/10/otro-tutorial-de-java-sesion-3-tipos-de.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-89140474174773157512019-10-12T12:21:00.001-05:002019-10-12T12:26:50.018-05:00Otro tutorial de Java: Sesión 2 - Teoría OOP y aplicación en Java<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vRe-oO2NHxuwW8EqfQsjFNEsJUC5c5PqTk6WuhCZT_CsDVfxxK3IDXvC6O3IMohGYMTIlaCGwv_xvsB/pub?w=1440&h=810" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vRe-oO2NHxuwW8EqfQsjFNEsJUC5c5PqTk6WuhCZT_CsDVfxxK3IDXvC6O3IMohGYMTIlaCGwv_xvsB/pub?w=1440&h=810" width="320"></a></div>
<br>
Comenzaremos un poco con la teoría de Objetos, y veremos cómo se aplica en Java.
<br>
<br>
<br>
<br>
<a href="https://www.apuntesdejava.com/2019/10/otro-tutorial-de-java-sesion-2-teoria.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-81367130258548275072019-10-12T12:19:00.001-05:002019-10-12T12:25:12.781-05:00Otro tutorial de Java: Sesión 1 - Instalación de entorno y primer programa<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vTLXSUbKnBkALC9tNiHREKb-lrgTavscgUaajIUMk8x7m3tTKIBLLYfjI28Ycz2AEEyeFBuw-11dBa-/pub?w=1440&h=810" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vTLXSUbKnBkALC9tNiHREKb-lrgTavscgUaajIUMk8x7m3tTKIBLLYfjI28Ycz2AEEyeFBuw-11dBa-/pub?w=1440&h=810" width="320"></a></div>
<br>
Comenzaremos una nueva serie de videos tutoriales llamado: <b>OTRO TUTORIAL DE JAVA
</b><br>
<br>
<br>
<br>
<a href="https://www.apuntesdejava.com/2019/10/otro-tutorial-de-java-sesion-1.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-57130641593392887702019-08-09T15:07:00.000-05:002019-08-09T15:07:12.104-05:00Liferay 7.2. Service Layer - Creando entidades y servicios<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vRWYwNzDfiluKRc-ql4aK9ewfCLX3o_HnWJCSHl_WMxezA8-BE6s17bLi7kFeLdhnYC1_uMWeaAcQ2b/pub?w=1440&h=810" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vRWYwNzDfiluKRc-ql4aK9ewfCLX3o_HnWJCSHl_WMxezA8-BE6s17bLi7kFeLdhnYC1_uMWeaAcQ2b/pub?w=1440&h=810" width="320"></a></div>
Sigamos con Liferay, ahora con el tema Service Layer.<br>
<br>
Liferay Service Builder es una herramienta de generación de código que permite, usando un archivo xml, generar una capa completa de servicios. La generación de código incluye definciones de base de datos, código para caché y persistencia, clases de servicios con métodos CURD y la capa de servicios remotos con compatibilidad con JSON y SOAP Web Services.<br>
<br>
¡Y todo esto con un solo archivo <code>service.xml</code> !<br>
<br>
<br>
<a href="https://www.apuntesdejava.com/2019/08/liferay-72-service-layer-creando.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-54513536059936476232019-07-17T17:24:00.001-05:002019-07-17T17:24:31.451-05:00Liferay 7.2. Atendiendo peticiones en un Portlet<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vQh9FP3WpHhNjo8yzKjDE65ruys-6Hig6hbf8UfQfWLnpelD5xPZj5quWVb3i_O0hk0scgKQdosD5Bv/pub?w=1440&h=810" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="179" src="https://docs.google.com/drawings/d/e/2PACX-1vQh9FP3WpHhNjo8yzKjDE65ruys-6Hig6hbf8UfQfWLnpelD5xPZj5quWVb3i_O0hk0scgKQdosD5Bv/pub?w=1440&h=810" width="320"></a></div>
Continuamos con las peticiones de un Portlet. En el anterior post vimos como navegar entre páginas. Esto es análogo a las peticiones GET de HTTP. Lo que ahora veremos es cómo atender peticiones tipo POST que generalmente están asociadas a las peticiones de un formulario.<br>
<br>
<br>
<a href="https://www.apuntesdejava.com/2019/07/liferay-72-atendiendo-peticiones-en-un.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com0tag:blogger.com,1999:blog-8553642737291298841.post-86845968326131240342019-07-15T18:01:00.003-05:002019-07-15T18:01:51.798-05:00Liferay 7.2. Navegando entre páginas<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vTxdgH8MG-YCvMVRSrC-WoVQy428pJq_5okgcOgeV3XxFaMGQxzdAnC4BUBSKADSRe46f-edfvTxTIn/pub?w=1440&h=810" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://docs.google.com/drawings/d/e/2PACX-1vTxdgH8MG-YCvMVRSrC-WoVQy428pJq_5okgcOgeV3XxFaMGQxzdAnC4BUBSKADSRe46f-edfvTxTIn/pub?w=1440&h=810" width="320"></a></div>
Como en toda página web es necesario conocer cómo navegar entre páginas. Naturalmente usaremos un tag <code>a</code>, pero un portlet de Liferay necesita cierto cuidado dado que se deben pasar parámetros específicos, además de considerar valores precargados dependiendo del caso.<br>
<br>
En este post conoceremos un poco la navegación de Liferay considerando el tag <code>liferay-portlet:renderURL</code>.<br>
<br>
<br>
<a href="https://www.apuntesdejava.com/2019/07/liferay-72-navegando-entre-paginas.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com3tag:blogger.com,1999:blog-8553642737291298841.post-77169590866918253112019-07-12T11:56:00.001-05:002019-07-15T00:00:29.709-05:00Jakarta EE 8 | JSF: Formulario con campo enum y LocalDate<div class="separator" style="clear: both; text-align: center;">
<a href="https://docs.google.com/drawings/d/e/2PACX-1vSEi2suLpvoTabxy6FaK_5Q5qrVtmmAoTjfK6LhimnPIPoWiqgR8_4LVlOffAFLXV_8u3mYDQpTWtPE/pub?w=1440&h=900" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="500" data-original-width="800" height="200" src="https://docs.google.com/drawings/d/e/2PACX-1vSEi2suLpvoTabxy6FaK_5Q5qrVtmmAoTjfK6LhimnPIPoWiqgR8_4LVlOffAFLXV_8u3mYDQpTWtPE/pub?w=1440&h=900" width="320"></a></div>
Siguiendo con nuestra serie de JSF (en Jakarta EE 8) hoy veremos cómo manejar campos de tipo <code>enum</code> y <code>LocalDate</code>.<br>
<br>
Estos campos no son comunes para manejar en un formulario web, donde generalmente se maneja en campos de tipo <code>String</code>.<br>
<br>
Veremos que Jakarta EE 8 manipula los de tipo <code>enum</code> de una manera transparente, mientras que los <code>LocalDate</code> necesita de una pequeña ayuda usando un <code>javax.faces.convert.Converter</code>.<br>
<br>
<br>
<a href="https://www.apuntesdejava.com/2019/07/jakarta-ee-8-jsf-formulario-con-campo.html#more">Leer el artículo completo »</a>Diego Silva Límacohttp://www.blogger.com/profile/04931472375833223136noreply@blogger.com3