12

DynamoDB用のAmazonWebServices SDKforJavaを使用しています。@DynamoDBMarshallingのインターフェースで十分にしようとしています:

Class<? extends DynamoDBMarshaller<? extends Object>> marshallerClass();

列挙型を受け取るマーシャラーを作成します。

public class EnumMarshaller<T extends Enum<T>> implements DynamoDBMarshaller<T>
{
    @Override
    public String marshall(T getterReturnResult)
    {
        return getterReturnResult.toString();
    }

    @Override
    public T unmarshall(Class<T> clazz, String obj)
    {
        return Enum.valueOf(clazz, obj);
    }
}

問題は、自分のフィールドで注釈を使用しようとすると、それを理解できないことです。

public static enum MyEnum {BLA, BLA2}

@DynamoDBMarshalling(marshallerClass=EnumMarshaller<MyEnum>.class)
    public MyEnum getStatus()
    {
        return status;
    }

ジェネリック型で.classを呼び出すことができず、他のいくつかの試行で異なるエラーが発生しました。アマゾンの契約では不可能だと思い始めています...

4

2 に答える 2

17

以下は私にはうまくいきました:

マーシャラー:

public class EnumMarshaller implements DynamoDBMarshaller<Enum> {
    @Override
    public String marshall(Enum getterReturnResult) {
        return getterReturnResult.name();
    }

    @Override
    public Enum unmarshall(Class<Enum> clazz, String obj) {
        return Enum.valueOf(clazz, obj);
    }
}

列挙型の私のテーブルクラスでは:

@DynamoDBMarshalling(marshallerClass=EnumMarshaller.class)
@DynamoDBAttribute(attributeName = "MyEnum")
public MyEnum getMyEnum() {
   return myEnum;
}
于 2013-12-06T16:45:25.640 に答える
4

JsonMarshallerを特定のクラスタイプでサブクラス化することにより、この問題を回避しました。

public class FooMarshaller extends JsonMarshaller<Foo>
{
    // No impl required
}

次に、マーシャリングアノテーションが次のようにデータプロパティに追加されます。

@DynamoDBMarshalling(marshallerClass = FooMarshaller.class)
public Set<Foo> getFoos()
{
    return foos;
}

多くのクラスタイプを追加する必要がある場合は苦痛ですが、それは機能します。

于 2012-05-01T23:58:58.297 に答える