DynamoDB хранит значение ha sh вместо json - PullRequest
2 голосов
/ 24 марта 2020

Я использую Java 8 и версию AWS SDK 1.11.

У меня есть следующее определение таблицы:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBVersionAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.encryption.DoNotTouch;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Set;

/**
 * Mapping between a tenant and the roles they defined to access their S3 Attachment buckets.
 */
@DynamoDBTable(tableName = CustomerRoleTenantMapping.TABLE_NAME)
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@DoNotTouch
public class CustomerRoleTenantMapping {

    public static final String TABLE_NAME = "CustomerRoleTenantMapping";

    /**
     * The identifier of this mapping between the tenant and the roles.
     */
    @DynamoDBHashKey(attributeName = "tenant")
    private String tenant;

    /**
     * The name of the tenant.
     */
    @DynamoDBAttribute(attributeName = "name")
    private String name;

    /**
     * The system that a tenant has allowed to access their S3 Attachment buckets.
     */
    @DynamoDBAttribute(attributeName = "tenantPlatform")
    private String tenantPlatform;

    /**
     * The roles associated to a tenant's S3 Attachment buckets.
     */
    @DynamoDBAttribute(attributeName = "customerRoles")
    private Set<RoleArn> customerRoles;

    @DynamoDBAttribute(attributeName = "version")
    @DynamoDBVersionAttribute
    private Long version;
}

Класс RoleArn определяется следующим образом:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument;
import com.amazonaws.services.dynamodbv2.datamodeling.encryption.DoNotTouch;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;

import java.util.Objects;

/**
 * Model for AWS Role ARNs.
 */
@DynamoDBDocument
@Builder
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@DoNotTouch
public class RoleArn {

    /**
     * The Role Arn.
     */
    @NonNull
    @DynamoDBAttribute(attributeName = "arn")
    private String arn;

    /**
     * The description of the role.
     */
    @NonNull
    @DynamoDBAttribute(attributeName = "description")
    private String description;

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof RoleArn) {
            return ((RoleArn) obj).arn.equals(arn);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(arn);
    }
}

Моя проблема заключается в том, что при попытке сохранить CustomerRoleTenantMapping Объект в моем DDB, RoleArn хранится не как JSON, а как ha sh экземпляра.

Просто к сведению, причина, по которой мне пришлось реализовать equals () и hashCode () в RoleArn, состоит в том, чтобы избежать дублирования объектов RoleArns в одном экземпляре CustomerRoleTenantMapping путем сравнения только атрибута arn двух экземпляров RoleArns. ,

Что я могу сделать, чтобы сохранить JSON набора вместо ха sh?

1 Ответ

1 голос
/ 24 марта 2020

DynamoDB mapper может конвертировать только ограниченный набор объектов по умолчанию:

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.DataTypes.html

Поскольку у вас есть набор объектов RoleArn, вам нужно будет использовать @DynamoDBTypeConverted аннотация и специальный класс TypeConvertor

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.ArbitraryDataMapping.html

Обновление: Короче говоря, вы должны написать другой класс, который сообщает DynamoDBmapper, как превратить ваш сложный объект в json, а затем преобразовать строку json обратно в сложный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...