

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Configuración de DynamoDB Mapper
<a name="ddb-mapper-configuration"></a>

****  
**DynamoDB Mapper es una versión preliminar para desarrolladores. No incluye todas las funciones y está sujeta a cambios.**

DynamoDB Mapper ofrece opciones de configuración que puede usar para personalizar el comportamiento de la biblioteca para adaptarlo a su aplicación.

## Utilice interceptores
<a name="ddb-mapper-interceptors"></a>

La biblioteca DynamoDB Mapper define enlaces que puede utilizar en las etapas críticas de la canalización de solicitudes del mapeador. Puede implementar la `[Interceptor](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/dynamodb-mapper/aws.sdk.kotlin.hll.dynamodbmapper.pipeline/-interceptor/index.html)` interfaz para implementar enlaces con el fin de observar o modificar el proceso del mapeador.

Puede registrar uno o más interceptores en un único DynamoDB Mapper como opción de configuración. Consulte el [ejemplo que aparece](#ddb-mapper-interceptors-hooks-example-conf) al final de esta sección para ver cómo registrar un interceptor.

### Comprenda el proceso de solicitudes
<a name="ddb-mapper-interceptors-pipeline"></a>

La canalización de solicitudes del mapeador consta de los siguientes 5 pasos:

1. **Inicialización:** configure la operación y recopile el contexto inicial.

1. **Serialización:** convierte los objetos de solicitud de alto nivel en objetos de solicitud de bajo nivel. Este paso convierte los objetos de Kotlin de alto nivel en elementos de DynamoDB compuestos por nombres y valores de atributos.

1. **Invocación de bajo nivel:** ejecute una solicitud en el cliente DynamoDB subyacente.

1. **Deserialización:** convierte los objetos de respuesta de bajo nivel en objetos de respuesta de alto nivel. Este paso incluye la conversión de los elementos de DynamoDB que constan de nombres y valores de atributos en objetos de Kotlin de alto nivel.

1. **Finalización: finalice** la respuesta de alto nivel para devolverla a la persona que llamó. Si se produjo una excepción durante la ejecución de la canalización, este paso finaliza la excepción que se envía a la persona que llama.

### Enlaces
<a name="ddb-mapper-interceptors-hooks"></a>

Los ganchos son métodos de intercepción que el mapeador invoca antes o después de pasos específicos de la canalización. Existen dos variantes de ganchos: los de *solo lectura y los de *modificación* (o lectura-escritura*). Por ejemplo, `readBeforeInvocation` es un enlace de solo lectura que el mapeador ejecuta en la fase anterior al paso de invocación de bajo nivel.

#### Ganchos de solo lectura
<a name="ddb-mapper-interceptors-hooks-ro"></a>

*El mapeador invoca los enlaces de solo lectura antes y después de cada paso del proceso (excepto antes del paso de *inicialización* y después del paso de finalización).* Los capós de solo lectura ofrecen una vista de solo lectura de una operación de alto nivel en curso. Proporcionan un mecanismo para examinar el estado de una operación para, por ejemplo, registrar, depurar o recopilar métricas. Cada enlace de solo lectura recibe un argumento de contexto y lo devuelve. `[Unit](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/)`

El mapeador detecta cualquier excepción que se produzca durante un enlace de solo lectura y la añade al contexto. A continuación, pasa el contexto, con la excepción de los siguientes ganchos interceptores que se encuentren en la misma fase. El mapeador envía cualquier excepción a la persona que llama solo después de llamar al enlace de solo lectura del último interceptor para la misma fase. Por ejemplo, si un mapeador está configurado con dos interceptores `A` y su `readAfterSerialization` gancho genera una excepción`B`, el mapeador agrega la excepción al contexto pasado al gancho. `A` `B` `readAfterSerialization` Una vez completado `B` `readAfterSerialization` el enlace, el mapeador devuelve la excepción a la persona que llama. 

#### Modifica los ganchos
<a name="ddb-mapper-interceptors-hooks-modify"></a>

El mapeador invoca los ganchos de modificación antes de cada paso del proceso (excepto antes de la *inicialización*). Los ganchos de modificación ofrecen la posibilidad de ver y modificar una operación de alto nivel en curso. Se pueden usar para personalizar el comportamiento y los datos de una forma que no lo hacen la configuración del mapeador y los esquemas de elementos. Cada enlace de modificación recibe un argumento de contexto y, como resultado, devuelve algún subconjunto de ese contexto, ya sea modificado por el enlace o transferido desde el contexto de entrada.

Si el mapeador detecta alguna excepción mientras ejecuta un gancho de modificación, no ejecuta ningún gancho de modificación de ningún otro interceptor en la misma fase. El mapeador añade la excepción al contexto y la pasa al siguiente enlace de solo lectura. El mapeador envía cualquier excepción a la persona que llama solo después de llamar al enlace de solo lectura del último interceptor para la misma fase. Por ejemplo, si un mapeador está configurado con dos interceptores `A` y su `modifyBeforeSerialization` gancho genera una excepción`B`, `B` no se invocará ese gancho. `A` `modifyBeforeSerialization` Se ejecutarán `A` los interceptores y el `readAfterSerialization` gancho `B'` S, tras lo cual se devolverá la excepción al autor de la llamada.

#### Orden de ejecución
<a name="ddb-mapper-interceptors-hooks-ex-order"></a>

El orden en que se definen los interceptores en la configuración de un mapeador determina el orden en que el mapeador llama a los ganchos:
+ Para las fases *anteriores* al paso de *invocación de bajo nivel*, ejecuta los ganchos en el *mismo orden* en que se agregaron a la configuración.
+ Para las fases *posteriores* al paso de *invocación de bajo nivel*, ejecuta los ganchos en el *orden inverso al orden* en que se agregaron a la configuración.

El siguiente diagrama muestra el orden de ejecución de los métodos de enlace:

![\[Diagrama de flujo de los métodos de gancho interceptor.\]](http://docs.aws.amazon.com/es_es/sdk-for-kotlin/latest/developer-guide/images/KotlinDevGuide-dynamodbMapper-hook-flowchart.png)


##### Descripción textual del orden de ejecución de los métodos de gancho
<a name="ixg_ypr_ddc"></a>

Un mapeador ejecuta los ganchos de un interceptor en el siguiente orden:

1. DynamoDB Mapper invoca una solicitud de alto nivel

1. Lea antes de la ejecución

1. Modificar antes de la serialización

1. Lea antes de la serialización

1. DynamoDB Mapper convierte objetos en elementos

1. Lea después de la serialización

1. Modificar antes de la invocación

1. Lea antes de la invocación

1. DynamoDB Mapper invoca la operación de bajo nivel

1. Lea después de la invocación

1. Modificar antes de la deserialización

1. Lea antes de la deserialización

1. DynamoDB Mapper convierte elementos en objetos

1. Lea después de la deserialización

1. Modificar antes de finalizar

1. Lea después de la ejecución

1. DynamoDB Mapper devuelve una respuesta de alto nivel

#### Configuración de ejemplo
<a name="ddb-mapper-interceptors-hooks-example-conf"></a>

El siguiente ejemplo muestra cómo configurar un interceptor en una instancia: `DynamoDbMapper`

```
import aws.sdk.kotlin.hll.dynamodbmapper.DynamoDbMapper
import aws.sdk.kotlin.hll.dynamodbmapper.operations.ScanRequest
import aws.sdk.kotlin.hll.dynamodbmapper.operations.ScanResponse
import aws.sdk.kotlin.hll.dynamodbmapper.pipeline.Interceptor
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.model.ScanRequest as LowLevelScanRequest
import aws.sdk.kotlin.services.dynamodb.model.ScanResponse as LowLevelScanResponse

val printingInterceptor = object : Interceptor<User, ScanRequest<User>, LowLevelScanRequest, LowLevelScanResponse, ScanResponse<User>> {
    override fun readBeforeDeserialization(ctx: LResContext<User, ScanRequest<User>, LowLevelScanRequest, LowLevelScanResponse>) {
        println("Scan response contains ${ctx.lowLevelResponse.count} items.")
    }
}

val client = DynamoDbClient.fromEnvironment()

val mapper = DynamoDbMapper(client) {
    interceptors += printingInterceptor
}
```