Saltar al contenido principal

Instalación y Configuración

Guía completa para instalar y configurar el Shori SDK en tu proyecto.


Requisitos del sistema​

ComponenteVersión mínima
Java17+
Maven3.6+
Spring Boot (opcional)2.7+ / 3.x

Instalación​

Añade el repositorio y la dependencia en tu pom.xml:

<!-- 1. Repositorio del SDK (GitLab Package Registry - público) -->
<repositories>
<repository>
<id>gitlab-maven</id>
<url>https://gitlab.com/api/v4/projects/84253138/packages/maven</url>
</repository>
</repositories>

<!-- 2. Dependencia -->
<dependency>
<groupId>com.nttdata.shori</groupId>
<artifactId>shori-api-client</artifactId>
<version>1.0.6</version>
</dependency>
Sin token requerido

El Package Registry es público. No necesitas configurar tokens ni credenciales para descargar el artefacto.


Configuración básica​

Parámetros requeridos​

ParámetroDescripciónEjemplo
environmentAmbiente de ShoriShoriEnvironment.PROD
portalIdUUID del portal en Shori"0306444E-38B1-..."
tenantIdUUID del tenant/organización"80ff134a-cae2-..."
apiKeyClave de API para autenticación"sk-live-xxxxx"
ShoriClient client = ShoriClient.builder()
.environment(ShoriEnvironment.PROD)
.portalId("0306444E-38B1-403D-8753-EC9C2BC43215")
.tenantId("80ff134a-cae2-4a4a-92b9-a109bdee1183")
.apiKey("tu-api-key-secreta")
.build();

Parámetros opcionales​

ParámetroDescripciónDefault
timeoutSecondsTimeout de conexión y respuesta30
allowInsecureSslAceptar certificados SSL auto-firmadostrue
maxConnectionsConexiones simultáneas por módulo5
downloadPathRuta local para archivos descargadoscarpeta temporal del SO
ShoriClient client = ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("tu-portal-id")
.tenantId("tu-tenant-id")
.apiKey("tu-api-key")
.timeoutSeconds(60)
.allowInsecureSsl(true)
.maxConnections(10)
.downloadPath("/opt/app/downloads")
.build();

Ambientes disponibles​

AmbienteConstanteDescripción
DesarrolloShoriEnvironment.DEVAmbiente local de desarrollo
PruebasShoriEnvironment.UATUser Acceptance Testing
ProducciónShoriEnvironment.PRODAmbiente productivo
// En desarrollo
ShoriClient devClient = ShoriClient.builder()
.environment(ShoriEnvironment.DEV)
.portalId("portal-dev")
.tenantId("tenant-dev")
.apiKey("api-key-dev")
.allowInsecureSsl(true)
.build();

// En producción
ShoriClient prodClient = ShoriClient.builder()
.environment(ShoriEnvironment.PROD)
.portalId("portal-prod")
.tenantId("tenant-prod")
.apiKey("api-key-prod")
.allowInsecureSsl(false)
.build();

Integración con frameworks​

Spring Boot​

Define el cliente como un @Bean en una clase de configuración:

@Configuration
public class ShoriConfiguration {

@Value("${shori.portal-id}")
private String portalId;

@Value("${shori.tenant-id}")
private String tenantId;

@Value("${shori.api-key}")
private String apiKey;

@Value("${shori.environment:PROD}")
private String environment;

@Value("${shori.timeout-seconds:30}")
private int timeoutSeconds;

@Bean(destroyMethod = "close")
public ShoriClient shoriClient() {
return ShoriClient.builder()
.environment(ShoriEnvironment.valueOf(environment))
.portalId(portalId)
.tenantId(tenantId)
.apiKey(apiKey)
.timeoutSeconds(timeoutSeconds)
.build();
}
}

application.properties:

shori.portal-id=0306444E-38B1-403D-8753-EC9C2BC43215
shori.tenant-id=80ff134a-cae2-4a4a-92b9-a109bdee1183
shori.api-key=${SHORI_API_KEY}
shori.environment=PROD
shori.timeout-seconds=30

application.yml:

shori:
portal-id: "0306444E-38B1-403D-8753-EC9C2BC43215"
tenant-id: "80ff134a-cae2-4a4a-92b9-a109bdee1183"
api-key: "${SHORI_API_KEY}"
environment: PROD
timeout-seconds: 30

Inyección en servicios:

@Service
public class CasoService {

private final ShoriClient shoriClient;

public CasoService(ShoriClient shoriClient) {
this.shoriClient = shoriClient;
}

public String crearSolicitud(Map<String, Object> datos) {
CasoCreateResponse resultado = shoriClient.caso().create(
CasoCreateRequest.builder()
.casoTypeId("tipo-uuid")
.formId("form-uuid")
.submittedData(datos)
.build()
);
return resultado.getCaso();
}
}

Gestión del ciclo de vida​

Cerrar el cliente manualmente​

// Al finalizar la aplicación
client.close();

En Spring Boot (automático)​

Al declarar el bean con destroyMethod = "close", Spring llama automáticamente a close() cuando el contexto se destruye. No es necesario ningún paso adicional.


Configuración de SSL​

Por defecto, allowInsecureSsl(true) está habilitado para facilitar el desarrollo. En producción, desactívalo:

ShoriClient client = ShoriClient.builder()
...
.allowInsecureSsl(false) // Verificar certificado SSL en producción
.build();
Seguridad en producción

Nunca uses allowInsecureSsl(true) en producción. Esto desactiva la verificación del certificado del servidor y expone la comunicación a ataques man-in-the-middle.


Integración con JavaFX y RDA/RPA​

Esta sección aplica exclusivamente al SDK Java.

Si usas el SDK en una aplicación de escritorio JavaFX o en un sistema de automatización (RDA/RPA) con múltiples ventanas o procesos, usa el ShoriClientRegistry para gestionar los clientes de forma centralizada.

¿Qué es ShoriClientRegistry?​

Es una clase de utilidad incluida en el SDK que actúa como registro centralizado de instancias de ShoriClient. Garantiza que cada cliente se inicialice una sola vez y se reutilice durante toda la vida de la aplicación.

Estructura recomendada para JavaFX​

public class RdaHubApp extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/MainView.fxml"));
Scene scene = new Scene(loader.load());
primaryStage.setScene(scene);
primaryStage.setTitle("RDA Hub");
primaryStage.show();
}

@Override
public void stop() throws Exception {
// Cierra TODOS los ShoriClients al cerrar la app
ShoriClientRegistry.closeAll();
}
}
public class PortabilityDownloadController {

private static final String CLIENT_NAME = "portabilidad";

@FXML
public void initialize() {
ShoriClientRegistry.register(
CLIENT_NAME,
ShoriClientRegistry.register(CLIENT_NAME, ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("portalId")
.tenantId("tenantId")
.apiKey("apiKey")
.timeoutSeconds(60)
.downloadPath("C:\\Users\\jramiror\\sdk")
.build())
);
}
}
public class PortabilitySearchService extends Service<List<CasoSearchResponse>> {

private static final String CLIENT_NAME = "portabilidad";

@Override
protected Task<List<CasoSearchResponse>> createTask() {
return new Task<>() {
@Override
protected List<CasoSearchResponse> call() {
ShoriClient client = ShoriClientRegistry.get(CLIENT_NAME);
return client.caso().searchAll(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "producto-uuid")
.workingSubStateId(FilterOperator.IN, "estado-uuid")
.pageSize(100)
.build()
);
}
};
}
}

Múltiples automatizaciones (RDA/RPA)​

// Cada automatización tiene su propio cliente con sus credenciales
ShoriClientRegistry.register("portabilidad",
ShoriClientRegistry.register(
CLIENT_NAME,
ShoriClientRegistry.register(CLIENT_NAME, ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("portalId")
.tenantId("tenantId")
.apiKey("apiKey")
.timeoutSeconds(60)
.downloadPath("C:\\Users\\jramiror\\sdk")
.build())
););

ShoriClientRegistry.register("activaciones",
ShoriClientRegistry.register(
CLIENT_NAME,
ShoriClientRegistry.register(CLIENT_NAME, ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("portalId")
.tenantId("tenantId")
.apiKey("apiKey")
.timeoutSeconds(60)
.downloadPath("C:\\Users\\jramiror\\sdk")
.build())
););

// En cada Service, obtener el cliente por nombre
ShoriClient client = ShoriClientRegistry.get("portabilidad");

Configuración avanzada (alta concurrencia)​

ShoriClientRegistry.register(
"portabilidad",
ShoriClientRegistry.register(
CLIENT_NAME,
ShoriClientRegistry.register(CLIENT_NAME, ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("portalId")
.tenantId("tenantId")
.apiKey("apiKey")
.timeoutSeconds(60)
.downloadPath("C:\\Users\\jramiror\\sdk")
.allowInsecureSsl(true)
.maxConnections(10)
.timeoutSeconds(30)
.build())
);
);

Javadoc y código fuente en el IDE​

A partir de la versión 1.0.6, el pipeline publica automáticamente junto al JAR principal los artefactos:

  • shori-api-client-1.0.6-sources.jar — código fuente del SDK
  • shori-api-client-1.0.6-javadoc.jar — documentación Javadoc compilada

Maven los descarga automáticamente al ejecutar mvn install.

Forzar descarga manual en el IDE

IntelliJ IDEA: Clic derecho sobre la dependencia en el panel Maven → Download Sources & Documentation

VSCode (Extension Pack for Java): Ctrl+Shift+P → Java: Import Java Projects para refrescar las dependencias


Solución de problemas comunes​

ValidationException: El ambiente (environment) es requerido​

// ❌ Incorrecto — falta el ambiente
ShoriClient.builder()
.portalId("id")
.apiKey("key")
.build();

// ✅ Correcto
ShoriClient.builder()
.environment(ShoriEnvironment.PROD)
.portalId("id")
.tenantId("tenant-id")
.apiKey("key")
.build();

AuthenticationException: Error al obtener token​

  • Verifica que el apiKey sea correcto para el ambiente seleccionado.
  • Confirma que el portalId y tenantId corresponden al ambiente seleccionado.
  • Revisa la conectividad de red con los servidores de Shori.

javax.net.ssl.SSLHandshakeException​

Si ves este error en UAT o DEV, habilita el modo SSL permisivo:

.allowInsecureSsl(true)

Acerca del timeout y searchAll​

timeoutSeconds aplica por cada request HTTP individual, no al proceso total de searchAll.

searchAll realiza múltiples requests en secuencia (uno por página). Si tienes 5.000 casos con pageSize=100, ejecuta 50 requests encadenados. Cada uno tiene su propio timeout independiente.

Solo necesitas aumentar timeoutSeconds si una sola llamada al API tarda en responder:

.timeoutSeconds(60) // útil si el API tarda en responder cada página individualmente