12

Tôi đang sử dụng Amazon Web Services SDK cho Java cho DynamoDB; cố gắng để đủ giao diện cho @DynamoDBMarshalling:Xây dựng một DynamoDBMarshalling chung cho enums

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

tôi xây dựng một marshaller tiếp nhận bất kỳ Enum:

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); 
    } 
} 

Vấn đề là khi tôi đang cố gắng sử dụng các chú thích trên sân của tôi, tôi có thể không tìm ra:

public static enum MyEnum {BLA, BLA2} 

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

Tôi không thể gọi .class trên loại chung và một số lần thử khác xuất hiện các lỗi khác nhau. tôi bắt đầu nghĩ rằng nó không thể với hợp đồng của Amazon ...

Trả lời

16

Sau đây làm việc tốt với tôi:

Các marshaller:

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); 
    } 
} 

Trong lớp bàn của tôi với một enum:

@DynamoDBMarshalling(marshallerClass=EnumMarshaller.class) 
@DynamoDBAttribute(attributeName = "MyEnum") 
public MyEnum getMyEnum() { 
    return myEnum; 
} 
+0

trong khi phương pháp này làm tăng một số cảnh báo (cả rawTypes và an toàn loại), nó hoạt động. –

+0

Rất tiếc, tôi không thể kiểm tra đơn vị lớp này vì 'marshaller.unmarshall (MyEnum.class, MyEnum.SOMETHING)' không biên dịch. Lớp bắt buộc làm thông số đầu tiên. – GuiSim

+1

Kể từ phiên bản 1.10.59, 'aws-java-sdk' hiện cung cấp ['AbstractEnumMarshaller'] (https://github.com/aws/aws-sdk-java/blob/199fba92dd0cdf4133f4aa5b08cfc10a11c27b31/aws-java-sdk -dynamodb/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/AbstractEnumMarshaller.java) là một phiên bản mạnh mẽ hơn của câu trả lời này. – cyfur01

4

tôi làm việc xung quanh vấn đề này bằng phụ classing các JsonMarshaller với một loại lớp học cụ thể:

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

Sau đó, chú thích marshalling được thêm vào thuộc tính dữ liệu như:

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

Một nỗi đau nếu bạn phải thêm nhiều loại lớp, nhưng nó hoạt động.

+0

cảm ơn, tôi chạy vào cùng vấn đề và đây là một sửa chữa nhanh chóng. Thêm vào đó tôi sẽ chỉ làm cho lớp này là "tĩnh tĩnh" bên trong. vì vậy, nó không cần phải được đặt trong một tập tin riêng biệt. – smartnut007

+3

Tôi không thấy làm thế nào điều này giúp cho mọi loại enum. Cách tôi nhìn thấy nó, bạn cần phải phụ lớp JsonMarshaller cho mỗi enum bạn tạo –

Các vấn đề liên quan