Estimados,
Esta disponible el curso gratuito de Spring Boot en mi canal de Youtube.
Estimados,
Esta disponible el curso gratuito de Spring Boot en mi canal de Youtube.
Over the years I have seen how some projects upload their code with indentation or without indentation.
I learned working with teams that apply good practices, that it is good to use a style guide for the source code.
One of them and widely used in other companies, is the google java format which follows google Java style guide. This post will explain how to use it and make sure no one else uploads its code without format.
- You need to download the Google Style and save it in a location on your PC.
- IntelliJ IDEA
- Any project using maven
In the project where you need to apply it code style you need to add the fmt-maven-plugin (available in GitHub) in your pom.xml.
We are configuring the plugin to apply Google format to src/main/java (our principal source code) and src/test/java (our tests cases).
Note: The plugin changed of groupId and will be soon in maven central. In the meantime, we are going to use the old groupId.
vi .git/hooks/pre-commit#! /bin/bashmvn com.coveo:fmt-maven-plugin:formatgit add -u
Looks your entity:
Ready. No more code without format or indentation in your git repo.
Enjoy
Joe
One day ago, my friend "Nazareno" showed me his code of how to call a database function and it had a structure like this:
The problem with it code is that only is managing the automatic close connection with the try-with-resources:
In it new try all the resources are closed in the reverse of the order in which they are created. Then an improvement to it code should be:try (var conn = ds.getConnection(); var cs = conn.prepareCall(sql)) {.... code supressed ....try(var rs = cs.executeQuery()){.... code supressed ....}}
Stop doing this:
rs.close();
cs.close();
While it is a good habit to close all the three resources, it isn't strictly necessary. Closing a JDBC resource should close any resources that is created. In theory it should happens:
It is important to close resources in the right order. This avoids both resource leaks and exceptions.
Use SQL Exception instead Exception and get more information:
...
} catch (SQLException e) {
System.out.println(e.getMessage());
System.out.println(e.getSQLState());
System.out.println(e.getErrorCode());
}
I learned of it experience so much too.
Enjoy!
Joe
This post is about the inspector backend, it will be deployed in our payara server.
The source code is on GitHub: https://github.com/joedayz/ws-inspector
1. This project will be using Jakarta EE, Microprofile, Blaze Persistence, Apache DeltaSpike, Lombok and Firebase-Admin as principal dependencies. See the pom.xml in GitHub.
2. In webapp/WEB-INF we have the beans.xml, glassfish-resource.xml and glassfish-web.xml:
globalAlternatives.org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy = org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy
@Getter
@Setter
@Entity
@Table(name = "asegurado", schema = "core")
public class AseguradoModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_asegurado")
private Long idAsegurado;
@Column(name = "nombre")
private String nombre;
@Column(name = "apellido_paterno")
private String apellidoPaterno;
@Column(name = "apellido_materno")
private String apellidoMaterno;
@Column(name = "id_ct_tipo_documento")
private String idCtTipoDocumento;
@Column(name = "numero_documento")
private String numeroDocumento;
@Column(name = "direccion")
private String direccion;
@Column(name = "id_distrito")
private Integer idDistrito;
@Column(name = "telefono_movil")
private String telefonoMovil;
@Column(name = "telefono_fijo")
private String telefonoFijo;
@Column(name = "correo")
private String correo;
@Column(name = "usuario_creacion", updatable = false)
private String usuarioCreacion;
@Column(name = "usuario_modificacion")
private String usuarioModificacion;
@Column(name = "fecha_creacion", updatable = false)
private LocalDateTime fechaCreacion;
@Column(name = "fecha_modificacion")
private LocalDateTime fechaModificacion;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "inspeccion", schema = "inspeccion")
public class InspeccionModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_inspeccion")
private Long idInspeccion;
@Column(name = "id_vehiculo_asegurado")
private Integer idVehiculoAsegurado;
@Column(name = "codigo_inspeccion")
private String codigoInspeccion;
@Column(name = "codigo_inspeccion_legall")
private String codigoInspeccionLegall;
@Column(name = "id_ct_estado_inspeccion")
private String estado;
@Column(name = "id_tramite")
private Integer idTramite;
@Column(name = "id_distrito")
private String idDistrito;
@Column(name = "id_empleado_inspector")
private Integer idEmpleadoInspector;
@Column(name = "observaciones")
private String observaciones;
@Column(name = "latitude")
private Double latitude;
@Column(name = "longitude")
private Double longitude;
@Column(name = "fecha_termino")
private LocalDateTime fechaTermino;
@Column(name = "direccion_inspeccion")
private String direccionInspeccion;
@Column(name = "usuario_creacion", updatable = false)
private String usuarioCreacion;
@Column(name = "fecha_creacion", updatable = false)
private LocalDateTime fechaCreacion;
@Column(name = "usuario_modificacion")
private String usuarioModificacion;
@Column(name = "fecha_modificacion")
private LocalDateTime fechaModificacion;
}
@Getter
@Setter
@Entity
@Table(name = "vw_inspecciones", schema = "public")
public class InspeccionView {
@Id
@Column(name = "id_informe")
private Long id;
@Column(name = "id_inspeccion")
private Long idInspeccion;
@Column(name = "codigo_inspeccion")
private String codigoInspeccion;
@Column(name = "codigo_inspeccion_legall")
private String codigoInspeccionLegall;
@Column(name = "observaciones")
private String observaciones;
@Column(name = "informe_fecha_programada")
private LocalDateTime fechaProgramada;
@Column(name = "id_distrito")
private String idDistrito;
@Column(name = "id_empleado_inspector")
private String idEmpleadoInspector;
@Column(name = "usuario_creacion")
private String usuarioCreacion;
@Column(name = "id_tramite")
private Integer idTramite;
@Column(name = "nro_tramite_compania_seguro")
private String numeroTramite;
@Column(name = "contacto")
private String contacto;
@Column(name = "placa")
private String placa;
@Column(name = "id_ct_motivo")
private String idCtMotivo;
@Column(name = "id_estado")
private String idEstado;
@Column(name = "estado")
private String estado;
@Column(name = "contratante_nombre")
private String contratanteNombre;
@Column(name = "contratante_razon_social")
private String contratanteRazonSocial;
@Column(name = "asegurado_nombre")
private String nombreApellido;
@Column(name = "telefono_fijo")
private String telefonoFijo;
@Column(name = "telefono_movil")
private String telefono;
@Column(name = "correo")
private String correo;
@Column(name = "direccion")
private String direccion;
@Column(name = "id_marca")
private String idMarca;
@Column(name = "marca")
private String marca;
@Column(name = "id_modelo")
private String idModelo;
@Column(name = "modelo")
private String modelo;
@Column(name = "id_vehiculo_asegurado")
private String idVehiculoAsegurado;
@Column(name = "id_asegurado")
private String idAsegurado;
public String getEstado() {
switch (estado) {
case "Pendiente":
return Constantes.ON_HOLD;
case "Digitado":
return Constantes.AVAILABLE;
case "Terminado":
return Constantes.COMPLETE;
default:
return estado;
}
}
}
These are the methods that will be generated thanks to EntityRepository:
- You can generate your own finders:
- Fortunately for us there is an integration between blaze and deltaspike to use views as entities, I used this integration to work with the view "vw_inspecciones" declared in our entity InspeccionView.
9. Before looking at our service layer. We see the producers created for the project in the config package:
Log Producer:
It then can be injected in some class to produce log in this way:
FirebaseConfig to work with our firebase account:
Note: It use the file firebase-sdk.json that must be in src/main/resources.
EntityManagerProducer where we use the reference of our persistence unit ("legall_pu"):
CriteriaBuilderFactoryProducer uses blaze-persistence to have a rich criteria API for JPA providers:
EntityViewManagerProducer use the BlazePersistence - Entity View Module. Blaze Persistence entity views try to solve these and many more problems a developer faces when having to implement efficient model mapping in a JPA application. It allows to define DTOs as interfaces and provides the mappings to the JPA model via annotations. It favors convention-over-configuration by providing smart defaults that allow to omit most mappings. By applying DTOs to a query builder through the ObjectBuilder
extension point it is possible to separate query logic from the projections while still enjoying high performance queries.
Finally CorsFilter to evict problems of CORS with our frontend:
10. Now is the moment of see our JAXRSConfiguration where will be using MicroProfile JWT.
This is very simple and minimalist. I love that.
- Our controllers depend on the roles allowed.
- We have some DTOs for request and response:
11. In our service layer we use the repositories and create the business logic:
In this post, we will be discussing the database model. We have 4 schemas: admin, core, inspection and public.
In the last post, we start with the explanation of our authentication/authorization server that provides JWT Tokens.
In this post, we start to build the first version of our angular application.
Source Code: https://github.com/joedayz/web-inspector (tag v1.0)
1. Create the angular application with Angular CLI.
npm install -g @angular/cli
2. Add these dependencies: Angular Material, Angular JWT, Angular Font Awesome, Angular2 Test Mask, SweetAlert2.
3. In Assets we have some fonts and images for our web admin:
4. In environments configure the principal PATHS:
Note: localhost must be changed with the domain name or IP of your server.
5. The routing shows the initial navigation:
6. Angular Material components are declared in a unique module. It permits to add more easily in other modules.
7. The main Dashboard has a drop-down menu, and toolbar and will serve to display the content in the central part.
The result is:
8. Finally the Login:
endpoint = `${environment.AUTH_ENDPOINT}/login`;
Enjoy!
Joe