简体   繁体   English

DynamoDb查询枚举

[英]DynamoDb querying Enum

I am new to dynamoDB and this question might be juvenile. 我是dynamoDB的新手,这个问题可能是青少年问题。

I am trying to query an item from the table but dynamo api is not able to convert the query json result into the class instance because there is an enum variable member present in the class. 我正在尝试从表中查询项目,但dynamo api无法将查询json结果转换为类实例,因为类中存在枚举变量成员。

My class Structure:[note that RequestStage is a Enum member] 我的课程结构:[请注意,RequestStage是Enum成员]

@DynamoDBTable(tableName = "LoadInfoProvider")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public final class LoadInfoProvider {

/** The load request ID. */
@DynamoDBRangeKey
private String loadRequestID;

/** The load request creation id. */
@DynamoDBHashKey
private String loadRequestCreationId;

/** The carrier ID. */
private String carrierID;

/** The carrier pool. */
private String carrierPool;

/** The carrier details. */
private CarrierDetail carrierDetails;

/** The driver assignment required. */
private Boolean driverAssignmentRequired;

/** The driver pool. */
private String driverPool;

/** The trailer attachment required. */
private Boolean trailerAttachmentRequired;

/** The request type. */
private String requestType;

/** The request stage. */
private RequestStage requestStage;

/** The created time. */
private String createdTime;

/** The consumed time. */
private String consumedTime;

/** The provider status. */
private String providerStatus;

/** The is consumed. */
private Boolean isConsumed;

/** The request status. */
private RequestStatus requestStatus;

/** The trip. */
private Trip trip;
}

RequestStageEnum : RequestStageEnum:

@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PUBLIC)
@DynamoDBDocument
public enum RequestStage {

/** The initiated. */
INITIATED("initiated"),

/** The passed. */
PASSED("passed"),

/** The failed. */
FAILED("failed");

/** The value. */
@Getter
@Setter
private String value;

}

When i query something from this table, i am getting the below error. 当我从该表中查询某些内容时,出现以下错误。

Exception in thread "main" com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Failed to instantiate new instance of class at com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas$StandardItemConverter.createObject(ConversionSchemas.java:614) at com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas$StandardItemConverter.unconvert(ConversionSchemas.java:414) at com.amazonaws.services.dynamodbv2.datamodeling.unmarshallers.ObjectUnmarshaller.unmarshall(ObjectUnmarshaller.java:54) at com.amazonaws.services.dynamodbv2.datamodeling.unmarshallers.NullableUnmarshaller.unmarshall(NullableUnmarshaller.java:46) at com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas$StandardItemConverter.unmarshall(ConversionSchemas.java:593) at com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas$StandardItemConverter.unconvert(ConversionSchemas.java:426) at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.privateMarshallIntoObject(D 线程“主”中的异常com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException:无法在com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas $ StandardItemConverter.createObject(ConversionSchemas.java:614)处实例化类的新实例。 .amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas $ StandardItemConverter.unconvert(ConversionSchemas.java:414)位于com.amazonaws.services.dynamodbv2.datamodeling.unmarshallers.ObjectUnmarshaller.unmarshall(ObjectUnmarshaller.com.at:54) .dynamodbv2.datamodeling.unmarshallers.NullableUnmarshaller.unmarshall(NullableUnmarshaller.java:46)位于com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas $ StandardItemConverter.unmarshall(ConversionSchemasmodelzon.data.zon.dy.na.dy.com。 .ConversionSchemas $ StandardItemConverter.unconvert(ConversionSchemas.java:426)在com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.privateMarshallIntoObject(D ynamoDBMapper.java:630) at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.marshallIntoObjects(DynamoDBMapper.java:661) at com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList.(PaginatedQueryList.java:65) at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.query(DynamoDBMapper.java:1856) at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.query(DynamoDBMapper.java:1844) at com.amazon.optimus.dynamoHelper.DynamoDBUtil.queryRecord(DynamoDBUtil.java:112) at com.amazon.optimus.dynamoHelper.DynamoDBUtil.main(DynamoDBUtil.java:164) Caused by: java.lang.InstantiationException: com.amazon.optimus.enums.RequestStage at java.lang.Class.newInstance(Class.java:427) at com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas$StandardItemConverter.createObject(ConversionSchemas.java:611) ... 12 more Caused by: java.lang.NoSuchMethodException: com.amazon.optimus.enums.RequestStage.() at java.lang.Class.getConstructor0(Class.java:3082) at ja ynamoDBMapper.java:630)在com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.marshallIntoObjects(DynamoDBMapper.java:661)在com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList。(PaginatedQueryList。位于com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.query(DynamoDBMapper.java:1844)的amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.java:1856 com.amazon.optimus.dynamoHelper.DynamoDBUtil.main(DynamoDBUtil.java:164)上的queryRecord(DynamoDBUtil.java:112)原因:java.lang.InstantiationException:java.lang上的com.amazon.optimus.enums.RequestStage。 com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas $ StandardItemConverter.createObject(ConversionSchemas.java:611)上的Class.newInstance(Class.java:427)... 12更多原因:java.lang.NoSuchMethodException:com.amazon JA的java.lang.Class.getConstructor0(Class.java:3082)的.optimus.enums.RequestStage。() va.lang.Class.newInstance(Class.java:412) ... 13 more va.lang.Class.newInstance(Class.java:412)...还有13个

It's clear from the exception, java is not able to instantiate the enum. 从异常可以明显看出,java无法实例化枚举。 How i can fix this and make this working? 我如何解决这个问题并使它正常工作? Your help is appreciated and thanks. 非常感谢您的帮助。

You need to annotate your field requestStage with @DynamoDBMarshalling . 您需要使用@DynamoDBMarshalling注释字段requestStage

Assuming RequestStage is an enum , here's what your marshaller might look like: 假设RequestStage是一个enum ,则封送员可能是这样的:

    public class RequestStageMarshaller implements DynamoDBMarshaller<RequestStage> {

        @Override
        public String marshall(RequestStage requestStage) {
            return requestStage.toString();
        }

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

    }

Then you'd annotate your requestStage field like so: 然后,您可以这样注释您的requestStage字段:

@DynamoDBMarshalling(marshallerClass = RequestStageMarshaller.class)
private RequestStage requestStage

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM