スキルのアトリビュート
アトリビュート
SDKを使うと、さまざまなスコープでアトリビュートの保存と取得ができます。たとえば、アトリビュートを使用して後続のリクエストで取得するデータを保存できます。また、ハンドラーのcanHandle
ロジックでアトリビュートを使用することで、リクエストのルーティングに影響を与えることもできます。
アトリビュートは、キーと値で構成されます。キーはString
型で強制型、値は無制限のObject
型です。セッションアトリビュートと永続アトリビュートの場合、値は保存して後で取得できるよう、シリアライズできるデータ型である必要があります。この制限はリクエストレベルのアトリビュートには適用されません。なぜならリクエストレベルのアトリビュートは、リクエスト処理のライフサイクルが終了すると、永続的に存在しないからです。
アトリビュートのスコープ
リクエストアトリビュート
リクエストアトリビュートは、1回のリクエスト処理ライフサイクルの間のみ存続します。リクエストを受信した時点では、リクエストアトリビュートは空です。また応答が生成されると破棄されます。
リクエストアトリビュートは、リクエストと応答のインターセプターと合わせて使うと便利です。たとえば、リクエストインターセプターを使って追加のデータとヘルパークラスをリクエストアトリビュートに挿入して、リクエストハンドラーから取得できるようにすることが可能です。
セッションアトリビュート
セッションアトリビュートは、現在のスキルセッションが継続している間存続します。セッションアトリビュートは、すべてのセッション内リクエストで使用できます。リクエスト処理のライフサイクル中に設定されたすべてのアトリビュートはAlexaサービスに返され、同じセッションの次のリクエストを通じて提供されます。
セッションアトリビュートで、外部ストレージソリューションを使用する必要はありません。セッションアトリビュートはセッション外のリクエストの処理では使用できません。
永続アトリビュート
永続アトリビュートは、現在のセッションのライフサイクルが終了しても存続します。主要なスコープ(ユーザーID、デバイスID)、TTL、ストレージレイヤーを含む、これらのアトリビュートがどのように保存されるかはスキルのコンフィギュレーションによって異なります。
永続アトリビュートは、PersistenceAdapter
を使用してスキルのインスタンスを設定する場合にのみ使用できます。PersistenceAdapter
が設定されていない場合に、AttributesManager
を呼び出して永続アトリビュートの取得と保存を行おうとするとIllegalStateException
がスローされます。AttributesManager
でsavePersistentAttributes()
を呼び出して、永続レイヤーに変更を保存し直します。AttributesManager
でdeletePersistentAttributes()
を呼び出して、永続レイヤーからアトリビュートを削除します。
AttributesManager
AttributesManager
には、ハンドラーで取得や更新を行えるアトリビュートがあります。AttributesManager
は、HandlerInput
コンテナクラスからハンドラーで使用できます。AttributesManager
は、スキルで必要なアトリビュートと直接やり取りできるように、アトリビュートの取得と保存を行います。
以下は、永続アトリビュートの取得と保存を行う方法のサンプルです。
@Override
public boolean canHandle(HandlerInput input) {
Map<String, Object> persistentAttributes = handlerInput.getAttributesManager().getPersistentAttributes();
return persistentAttributes.get("foo").equals("bar");
}
@Override
public Optional<Response> handle(HandlerInput input) {
Map<String, Object> persistentAttribues = handlerInput.getAttributesManager().getPersistentAttributes();
persistentAttributes.put("foo", "baz");
return Optional.empty();
}