En este vídeo conoceremos un poco de Quarkus, crear una aplicación MicroProfile, y ejecutarlo desde NetBeans.
Luego iremos desarrollando más funcionalidades MicroProfile en este proyecto de Quarkus
By Diego Silva Límaco
#CodeReviewChallenge
— ☕ Apuntes de Java ☕ 😷🏠 (@apuntesdejava) April 6, 2020
A ver, cómo optimizarían este código (que encontré)? pic.twitter.com/PUWZy0erpG
#CodeReviewChallenge #QuedateEnCasa #StayHome
— ☕ Apuntes de Java ☕ 😷🏠 (@apuntesdejava) April 7, 2020
¿Cómo simplificarían el contenido de este método? (sin usar bibliotecas adicionales) pic.twitter.com/rfRn8Qb2Ga
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.
Hasta el momento hemos creado consultas simples, como listar todos los registros con un campo u otro campo iguales.
DynamicQuery
, y es lo que veremos en este post.
Aquí les presento la primera versión de mi aplicación MP Lemon Builder.
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); } //... }
GET
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 POST
, DELETE
, etc.@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(); } }
@POST
create()
para insertar registros@GET
list()
para leer todos los registros@DELETE
delete()
para borrar un registro@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); }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.
PersonEndpoint client = JAXRSClientFactory.create( REST_URI, PersonEndpoint.class, Arrays.asList( new JacksonJaxbJsonProvider() ));
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 }
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()}); }); }
Sigamos con Liferay, ahora con el tema Service Layer.
service.xml
!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.
Como en toda página web es necesario conocer cómo navegar entre páginas. Naturalmente usaremos un tag
a
, 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.liferay-portlet:renderURL
.Siguiendo con nuestra serie de JSF (en Jakarta EE 8) hoy veremos cómo manejar campos de tipo
enum
y LocalDate
.String
.enum
de una manera transparente, mientras que los LocalDate
necesita de una pequeña ayuda usando un javax.faces.convert.Converter
.Siguiendo con nuestros vídeos de Liferay, ahora veremos cómo crear un portlet.
Comenzaremos una serie de vídeos (adicional a la de Jakarta EE 8) para aprender a desarrollar con Liferay 7.2
Seguimos con los vídeos de JSF.
Ahora veremos cómo validar unos campos en JSF:
La inicialización es el asignar un valor inicial cuando se declara una variable. Esto se puede poner en los atributos de las clases:
//... public class OrdenCompra{ private java.util.Date fecha=new java.util.Date(); //...
OrdenCompra
se le asignará un valor inicial (la fecha y hora actual) a la propiedad fecha
.
En este vídeo veremos cómo crear una aplicación web usando el arquetipo de Java EE 8. Además veremos cómo configurarla para que funcione con JSF.
Con este proyecto veremos más funcionalidades que nos trae Jakarta EE 8. Comenzaremos con JSF.
Una de las cosas que extrañaba de C en Java es la capacidad de apuntar a una función. En lugar de invocar a una función directamente, podía hacerlo a través de una variable. Esto es: no importa a qué apunta a esa variable, cuando se invoca con los parámetros correctos, lo ejecutará.
Acabo de bajar Apache NetBeans 11, y en este vídeo muestro (sin pruebas anteriores) cómo ejecuto mi IDE favorito. Ya tenía instalado Corretto 11, y simplemente descomprimí el IDE y lo ejecuté.