aws-sdk-javaをscalaからscala wayで利用するためのラッパーライブラリAWScalaのDynamoDBラッパーからDAXを操作するという話です。
ClusterDaxClientを継承し、AWScalaのDynamoDBトレイトを継承した独自クラスを定義する
AWScalaのDynamoDBラッパーは、DynamoDBトレイトをクライアントとして、putやgetといった操作のimplicit引数にとるので、DynamoDBトレイトを継承することができれば、DynamoDBラッパーからDAXを操作することができます。
詳細はDynamoDBラッパーのテストケースを参照
テストケース
なので、以下のようなクラスを用意します。
import awscala.dynamodbv2.DynamoDB
import com.amazon.dax.client.dynamodbv2.{ClientConfig, ClusterDaxClient}
/**
* AWS公式のDAXクライアントにawscalaのDynamoDBトレイトをかぶせることで、
* awscalaのDynamoDBクライアントと同じように扱えるようにした
*/
class DaxClient(cfg: ClientConfig) extends ClusterDaxClient(cfg) with DynamoDB{
}
上記のクラス定義が可能な理由
DynamoDBトレイトは、以下のようにaws-sdk-javaのAmazonDynamoDBインターフェイスを継承しています
trait DynamoDB extends aws.AmazonDynamoDB
AmazonDynamoDBインターフェイスを実装しているクラスであれば、DynamoDBトレイトを継承できそうです。
一方、ClusterDaxClientは以下のように、AbstractAmazonDynamoDBという抽象クラスを継承しています。
public class ClusterDaxClient extends AbstractAmazonDynamoDB implements AmazonDaxClient
そして、AbstractAmazonDynamoDB抽象クラスは、以下のようにAmazonDynamoDBインターフェイスを実装しています。
public class AbstractAmazonDynamoDB implements AmazonDynamoDB
ClusterDaxClientはAmazonDynamoDBインターフェイスを実装しているため、結果的に上記の独自クラスのような定義が可能となっています。