Veamos como utilizar el conector de jdbc que provee hybris desde una aplicaciòn de spring boot y algunos casos de uso donde puede ser de gran utilidad
virtualjdbc
hybris provee un conector que funciona bajo el protocolo de JDBC para la ejecución de queries a un sistema de hybris, la ventaja del uso de esta herramienta reside en poder utilizar las flexible search queries para tener la capa de ORM en la ejecucion de las consultas y así facilitar: multi lenguaje, reportes, nombres reales de las columnas, relaciones, etc.
proyecto con Java
La idea de esta publicación es ejemplificar como crear un proyecto de Java para exponer un endpoint que se conecte con un backend de hybris mediante el conector de virtualjdbc
La estructura del proyecto fue generada utilizando spring initializr con Java 11, gradle para la resolucion de dependencias y compilado y spring boot web para exponer el endpoint
dependencias de hybris
Las librerías tendrán que ser resueltas de forma local ya que hybris no las expone en algún repositorio público (como maven, por ejemplo)
- La primera librería que necesitamos es
~/hybris/bin/ext-platform-optional/virtualjdbc/bin/virtualjdbcserver.jar
- También hay algunas dependencias para el virtualjdbc no existen directamente en la instalación de hybris, así que hay que descargarlas de aquí
Una vez que tengamos las librerías descargadas, podemos ir a nuestro proyecto y crear una carpeta ~/libs
donde ingresaremos todos los archivos jar que vamos a utilizar:

Ahora necesitamos indicar a gradle que lea los jars necesarios para este proyecto:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// local jar files for the virtualjdbc connection
implementation files('libs/virtualjdbcserver.jar')
implementation files('libs/vjdbc/lib/vjdbc.jar')
implementation files('libs/vjdbc/lib/vjdbc_server.jar')
implementation files('libs/vjdbc/lib/jakarta-oro-2.0.8.jar')
implementation files('libs/vjdbc/lib/commons-pool-1.3.jar')
implementation files('libs/vjdbc/lib/commons-logging-1.1.jar')
implementation files('libs/vjdbc/lib/commons-httpclient-3.0.1.jar')
implementation files('libs/vjdbc/lib/commons-digester-1.7.jar')
implementation files('libs/vjdbc/lib/commons-dbcp-1.2.1.jar')
implementation files('libs/vjdbc/lib/commons-collections-3.2.jar')
implementation files('libs/vjdbc/lib/commons-codec-1.3.jar')
implementation files('libs/vjdbc/lib/commons-beanutils-core.jar')
}
configuración del DataSource
Es momento configurar el acceso a la "base de datos" (que en este caso sabemos que es directamente el sistema de hybris). Comunmente esto se logra sólo con indicar a spring cual es el datasource que vamos a utilizar mediante tu archivo properties o yaml
spring.datasource.url=jdbc:hybris:flexiblesearch:https://localhost:9002/virtualjdbc/service?tenant=master
spring.datasource.username=admin
spring.datasource.password=nimda
spring.datasource.driver-class-name=de.hybris.vjdbc.VirtualDriver
Algunos puntos importantes a considerar en la cadena de conexión son:
- flexiblesearch - Indica al virtualjdbc que usaremos este lenguaje, puede cambiarse por sql
- tenant - Indica el tenant al que vamos a consultar. Aunque tener múltiples tenants ya sea cada vez más raro, es una posibilidad
capa de seguridad
hybris forza esta integración a utilizar una conexión segura por medio de un certificado, para las pruebas locales puedes encontrarlo en ~/hybris/bin/platform/resources/devcerts/ydevelopers.jks
Esto requiere que configuremos la aplicación para confiar en este store desde el archivo de configuración de gradle:
bootRun {
jvmArgs = [
'-Djavax.net.ssl.trustStore=/full/path/to/hybris/bin/platform/resources/devcerts/ydevelopers.jks',
'-Djavax.net.ssl.trustStoreType=JKS',
'-Djavax.net.ssl.trustStorePassword=123456'
]
}
problemas
Durante el desarrollo de esta prueba de concepto encontramos que no era suficiente indicar los datos de conexión al datasource para que el JdbcTemplate funcione correctamente, por lo que fue necesario agregar una clase de configuración para leer las mismas propiedades e instanciar el elemento necesario:
@Configuration
public class HybrisConfig {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String jdbcUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
private Object getInstance(final Class<?> driverClass) throws InvocationTargetException, InstantiationException, IllegalAccessException {
final var constructor = ClassUtils.getConstructorIfAvailable(driverClass);
if (constructor == null) {
return null;
}
return constructor.newInstance();
}
@Bean
public JdbcTemplate jdbcTemplate() throws InvocationTargetException, InstantiationException, IllegalAccessException {
final var driverClass = ClassUtils.resolveClassName(driverClassName, this.getClass().getClassLoader());
final var instance = getInstance(driverClass);
Assert.isTrue(instance instanceof Driver, "instance should be an instance of Driver");
final var driver = (Driver) instance;
final var dataSource = new SimpleDriverDataSource(driver, jdbcUrl, username, password);
// and make the jdbcTemplate
return new JdbcTemplate(dataSource);
}
}
haciendo uso de la conexión
La prueba consiste en alcanzar un endpoint que retorne el nombre y el codigo de todos los productos dentro de hybris

La clase ProductRowMapper unicamente se encarga de hacer el volcado de información de los resultados hacia el DTO ProductDTO:

ejecutando la prueba
Si consumimos el endpoint, obtenemos el resultado que estamos buscando:

En hybris podremos observar los siguientes mensajes en la bitácora:
INFO [hybrisHTTP5] [VjdbcPlatformServlet] Underlying VJDBC server is up : de.hybris.platform.virtualjdbc.jalo.VjdbcServerWrapper@2da610fd
INFO [hybrisHTTP19] [CommandProcessor] Connection 1 closed, statistics:
INFO [hybrisHTTP19] [ConnectionEntry] Connection ........... vjdbc
INFO [hybrisHTTP19] [ConnectionEntry] IP address ........... 127.0.1.1
INFO [hybrisHTTP19] [ConnectionEntry] Host name ............ carlos
INFO [hybrisHTTP19] [ConnectionEntry] Last time of access .. Wed May 26 20:11:44 CDT 2021
INFO [hybrisHTTP19] [ConnectionEntry] Processed commands ... 6
casos de uso
Existen muchos casos por los cuales podríamos necesitar una conexión directa al sistema de hybris con la capa del ORM:
- Generación de reportes desde sistemas terceros
- Extraer información para sistemas que cuentan con opciones limitadas para realizar una integración hacia hybris
- Pruebas automatizadas con escenarios complejos donde es necesario hacer una validación en la base de datos (por ejemplo, pruebas punto a punto)
conclusiones
La conexion mediante virtualjdbc hacia un sistema de SAP Commerce tiene muchas ventajas dentro del equipo de desarrollo, ya sea para pruebas automatizadas o incluso para reducir/mover la complejidad en la extracción de información
Puedes encontrar el codigo de este post en este repositorio