Estoy tratando de usar escrituras transaccionales para DynamoDB en Kotlin.
Caso de uso: quiero escribir dos objetos diferentes en dos tablas diferentes en la misma transacción. Por ejemplo: escriba AClass en la Tabla 1 y escriba BClass en la Tabla 2.
Esto hubiera sido sencillo si los nombres de Table1 y Table2 fueran los mismos para cada escenario.
Sin embargo, estoy usando un marco sin servidor y, según la etapa que se haya especificado,
Table1 puede ser: local-Table1 / dev-Table1 / production-Table1 .
Lo mismo para Table2
Sin embargo, en mi declaración de clase de AClass , si trato de anotar AClass mediante @DynamoDBTable(tableName = "$stage-Table1") , aparece el error Un argumento de anotación debe ser una constante de tiempo de compilación .
Esto significa que el nombre de la tabla debe proporcionarse por separado en el flujo. Para superar esto en los escenarios habituales de escritura/obtención, estaba usando la siguiente configuración:
private val dynamoDBMapperConfig = DynamoDBMapperConfig.Builder() .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(tableName)) .build() mapper.save(t, dynamoDBMapperConfig)Según la documentación, tendré que hacer lo siguiente:
TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest() transactionWriteRequest.addPut(aClassObject) transactionWriteRequest.addPut(bClassObject) mapper.transactionWrite(transactionWriteRequest)Si los objetos de AClass y BClass se escribieran en la misma tabla, podría haber usado de nuevo un DynamoDBMapperConfig personalizado. Sin embargo, ambos objetos deben escribirse en dos tablas diferentes y, dado que los nombres de las tablas deben resolverse durante el tiempo de ejecución, no puedo proporcionarlos como parte de las anotaciones de clase.
¿Cómo resuelvo esto? (Quiero usar el mapeador de objetos)
Estoy usando un asignador de DynamoDB personalizado para cambiar el nombre de la tabla en tiempo de ejecución, ya que el nombre de la tabla es diferente en cada entorno.
Mesa:
@DynamoDBTable(tableName="dummy-table-Name") public class DynamoTableAsignador personalizado para el nombre de la tabla dinámica :
DynamoDBMapperConfig.TableNameOverride tableNameOverriderride = new DynamoDBMapperConfig.TableNameOverride("DYNAMIC_TABLE_NAME"); DynamoDBMapperConfig config =new DynamoDBMapperConfig(tableNameOverriderride); DynamoDBMapper mapper =new DynamoDBMapper(client, config);Realice la operación CRUD utilizando el mapeador anterior:
DynamoTable dynamoTable = mapper.load(DynamoTable.class, id); mapper.save(dynamoTable);