Jmoordb-core implementando lookup(Search search) con MicroprofileRest
Mostrare como utilizar MicroProfile RestClient con un Microservicio creado con las APIS de Microprofile sobre PayaraMicro.
Usamos Jmoordb-core para este proyecto
<properties>
<jakartaee>10.0.0</jakartaee>
<version.payara>6.2022.1</version.payara>
<microprofile.version>5.0</microprofile.version>
<version.jmoordbcore>0.12</version.jmoordbcore>
<version.jmoordbfaces>1.3</version.jmoordbfaces>
<version.jmoordbutilfaces>0.7</version.jmoordbutilfaces>
<version.jmoordbencripter>1.0</version.jmoordbencripter>
</properties>
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>${jakartaee}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<version>${microprofile.version}</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile.config</groupId>
<artifactId>microprofile-config-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile.health</groupId>
<artifactId>microprofile-health-api</artifactId>
<version>3.1</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
<type>jar</type>
</dependency>
<!--Jakarta Faces
-->
<dependency>
<groupId>jakarta.faces</groupId>
<artifactId>jakarta.faces-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>12.0.0</version>
<classifier>jakarta</classifier>
</dependency>
<!--
lombok
-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>font-awesome</artifactId>
<version>6.0.0</version>
</dependency>
<!--
jmoordb-core
-->
<dependency>
<groupId>com.github.avbravo</groupId>
<artifactId>jmoordb-core</artifactId>
<version>${version.jmoordbcore}</version>
</dependency>
<!--
Encriptation
-->
<dependency>
<groupId>com.github.avbravo</groupId>
<artifactId>jmoordbencripter</artifactId>
<version>${version.jmoordbencripter}</version>
</dependency>
</dependencies>
Partimos de la idea que contamos con una base de datos en MongoDB y en ella una colecciĆ³n llamada appconfiguration.
Es una entidad que contiene una lista de documentos referenciados a una colecciĆ³n llamada role.
Definimos la entidad Role
import com.jmoordb.core.annotation.Column;
import com.jmoordb.core.annotation.Entity;
import com.jmoordb.core.annotation.Id;
import com.jmoordb.core.annotation.enumerations.AutogeneratedActive;
/**
*
* @author avbravo
*/
@Entity
public class Role {
@Id(autogeneratedActive = AutogeneratedActive.ON)
private Long idrole;
@Column
private Boolean active;
@Column
private String role;
// constructor set/get
}
Defina la entidad Appconfiguration especificando la referencia
import com.jmoordb.core.annotation.Column;
import com.jmoordb.core.annotation.Entity;
import com.jmoordb.core.annotation.Id;
import com.jmoordb.core.annotation.Referenced;
import com.jmoordb.core.annotation.enumerations.AutogeneratedActive;
import java.util.List;
/**
*
* @author avbravo
*/
@Entity()
public class Appconfiguration {
@Id(autogeneratedActive = AutogeneratedActive.ON)
private Long idappconfiguration;
@Column
private Boolean active;
@Referenced(from = "applicative", localField = "idapplicative")
private Applicative applicative;
@Referenced(from = "role", localField = "idrole")
private List<Role> role;
// constructor set/get
}
Cree el repositorio para la entidad Role
import com.jmoordb.core.annotation.repository.Lookup; import com.jmoordb.core.annotation.repository.Repository; import com.jmoordb.core.model.Search; import com.jmoordb.core.repository.CrudRepository; import com.sft.model.Role; import java.util.List; /** * * @author avbravo */ @Repository(entity = Role.class) public interface RoleRepository extends CrudRepository<Role, Long> { @Lookup public List<Role> lookup(Search search); }
Cree el repositorio para la entidad Role
@Repository(database = "{mongodb.database1}", entity = Actividad.class)
public interface ActividadRepository extends CrudRepository<Actividad, Long>{
@Lookup
public List<Actividad> lookup(Search search);
}
// constructor set/get
}
Cree el controller y defina el mƩtodo lookup
@Path("appconfiguration")
@Tag(name = "InformaciĆ³n del appconfiguration", description = "End-point para entidad Appconfiguration")
@RolesAllowed({"admin"})
public class AppconfigurationController {
@Inject
AppconfigurationRepository appconfigurationRepository;
@GET
@Path("lookup")
@RolesAllowed({"admin"})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<Appconfiguration> lookup(@QueryParam("filter") String filter, @QueryParam("sort") String sort, @QueryParam("page") Integer page, @QueryParam("size") Integer size) {
Search search = DocumentUtil.convertForLookup(filter, sort, page, size);
return appconfigurationRepository.lookup(search);
}
}
Luego creamos un proyecto nuevo e implementamos Microprofile RestClient
Para ello defina en el archivo microprofile-config.properties la referencia a mp-rest indicado la clase que hara la implementaciĆ³n y el iurl
com.sft.client.AppconfigurationClient/mp-rest/url=http://localhost:9002/accreditation/api/
Proceda a crear la interface AppconfigurationClient
package com.sft.client;
@RegisterRestClient()
@Path("/appconfiguration")
public interface AppconfigurationClient {
@GET
@Path("lookup")
public List<Appconfiguration> lookup(@QueryParam("filter") String filter, @QueryParam("sort") String sort, @QueryParam("page") Integer page, @QueryParam("size") Integer size);
}
Cree una clase desde la cual inyectara AppconfigurationClient
@Named
@SessionScoped
public class LoginFaces implements Serializable {
@Inject
AppconfigurationClient appconfigurationClient;
public List<Appconfiguration> searchAppConfiguration() {
try {
Integer page = 1;
Integer size = 1;
Bson filter = new Document("applicative.idapplicative", idapplicative.get().longValue());
Document sort = new Document("applicative.idapplicative", 1);
return appconfigurationClient.lookup(
EncodeUtil.encodeBson(filter),
EncodeUtil.encodeBson(sort),
page, size);
} catch (Exception e) {
FacesUtil.errorMessage(FacesUtil.nameOfMethod() + " " + e.getLocalizedMessage());
}
return new ArrayList<>();
}
}
Puede observar que el filtro es un BSON de MongoDB y el Sort es un Document de MongoDB, aplicamos un encode mediante EncodeUtil.encodeBson() e invocamos el mƩtodo de la interface que corresponde al endopoint.
La utilizaciĆ³n de Microprofile RestClient nos ayuda mucho para establecer la comunicaciĆ³n con los endpoint.
Comments