azure - TableEntity 仅部分保存在 auzre 存储表中
问题描述
我在 azure 存储表中保存表实体时看到了一种非常奇怪的行为。我的实体定义如下所示:
#File name is BatchJobRunTableEntity.java
package com.affinnova.batchJobs.db;
import com.microsoft.azure.storage.table.TableServiceEntity;
import groovy.json.JsonOutput;
import org.bson.types.ObjectId;
import java.util.Date;
import java.util.Map;
public class BatchJobRunTableEntity extends TableServiceEntity {
public BatchJobRunTableEntity(String jobId, String taskId) {
this.partitionKey = jobId;
this.rowKey = taskId;
}
public BatchJobRunTableEntity() {
}
public String accountId;
public String jobId;
public String taskId;
public String referenceKeys;
public String meta;
public String task;
public String batchServiceIdentifier;
public String clientGroupId;
public String state;
public String createdBy;
public String lastUpdatedBy;
public Date dateCreated;
public Date lastUpdated;
public void setAccountId(String accountId) {
this.accountId = accountId;
}
public String getAccountId() {
return this.accountId;
}
public void setJobId(String jobId) {
this.jobId = jobId;
}
public String getJobId() {
return this.jobId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public void setTaskId(ObjectId taskId) {
this.taskId = String.valueOf(taskId);
}
public String getTaskId() {
return this.taskId;
}
public void setReferenceKeys(String referenceKeys) {
this.referenceKeys = referenceKeys;
}
public void setReferenceKeys(Map referenceKeys) {
this.setReferenceKeys(JsonOutput.toJson(referenceKeys));
}
public String getReferenceKeys() {
return this.referenceKeys;
}
public void setMeta(String meta) {
this.meta = meta;
}
public void setMeta(Map meta) {
this.setMeta(JsonOutput.toJson(meta));
}
public String getMeta() {
return this.meta;
}
public void setTask(String task) {
this.task = task;
}
public void setTask(Map task) {
this.setTask(JsonOutput.toJson(task));
}
public String getTask() {
return this.task;
}
public void setBatchServiceIdentifier(String batchServiceIdentifier) {
this.batchServiceIdentifier = batchServiceIdentifier;
}
public String getBatchServiceIdentifier() {
return this.batchServiceIdentifier;
}
public void setClientGroupId(String clientGroupId) {
this.clientGroupId = clientGroupId;
}
public String getClientGroupId() {
return this.clientGroupId;
}
public void setState(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getCreatedBy() {
return this.createdBy;
}
public void setLastUpdatedBy(String lastUpdatedBy) {
this.lastUpdatedBy = lastUpdatedBy;
}
public String getLastUpdatedBy() {
return this.lastUpdatedBy;
}
public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
public Date getDateCreated() {
return this.dateCreated;
}
public void setLastUpdated(Date lastUpdated) {
this.lastUpdated = lastUpdated;
}
public Date getLastUpdated() {
return this.lastUpdated;
}
}
我的应用程序在 groovy 中,我发现 groovy 类不能很好地处理实体对象,所以我创建了一个 java 类。现在,除了“referenceKeys”之外的所有内容都存储在表中。最初我认为它可能是数据,但即使我将相同的数据设置为“referenceKeys”、“meta”,也只有 meta 被存储,但 referenceKeys 只是被拒绝。我已经设置了调试点以确保也设置了数据。
这是一个例子:
BatchJobRunTableEntity batchJobRunTableEntityTmp = new BatchJobRunTableEntity("jobA", "taskA")
batchJobRunTableEntityTmp.setTaskId("taskA")
batchJobRunTableEntityTmp.setReferenceKeys(["keyA": "a", "keyB": "b"])
batchJobRunTableEntityTmp.setMeta(["keyA": "a", "keyB": "b"])
TableResult resultt = cloudTable.execute(TableOperation.insert(batchJobRunTableEntityTmp))
它几乎就像referenceKeys 甚至没有在实体中定义。
我在 java 7 中并使用此依赖项:'com.microsoft.azure:azure-storage:7.0.0'
更新 发现这是因为方法重载,我有两种设置器,一种用于字符串,另一种用于映射。如果我删除了 map 的重载方法,事情仍然有效,但仍然无法解释为什么它适用于“meta”但不适用于“referenceKeys” - 轻微颠簸但可行。
#HAD TO REMOVE THESE METHODS
public void setMeta(Map meta) {
this.setMeta(JsonOutput.toJson(meta));
}
public void setReferenceKeys(Map referenceKeys) {
this.setReferenceKeys(JsonOutput.toJson(referenceKeys));
}
解决方案
发现这是因为方法重载,我有两种设置器,一种用于字符串,另一种用于映射。如果我删除了 map 的重载方法,事情仍然有效,但仍然无法解释为什么它适用于“meta”但不适用于“referenceKeys” - 轻微颠簸但可行。
#HAD TO REMOVE THESE METHODS
public void setMeta(Map meta) {
this.setMeta(JsonOutput.toJson(meta));
}
public void setReferenceKeys(Map referenceKeys) {
this.setReferenceKeys(JsonOutput.toJson(referenceKeys));
}
更新:
也不得不删除这种方法,在生产中咬我。所以绝对不支持函数重载。
public void setTaskId(String taskId) {
this.taskId = taskId;
}
推荐阅读
- docker - Swagger-UI (Docker) - “试用”时不维护基本路径
- rest - 为 Rest Api 调用问题构建参数
- r - 到图例文本ggplot的距离
- cakephp - CakePHP 3.6.x CSRF 令牌不匹配
- sql - 在 SQL 中选择 SEQUENCE:FROM 关键字未在预期的位置找到
- matplotlib - 如何在 Matplotlib 上叠加
- r - x轴上两个日期之间的ggplot geom vline
- html - W3Schools 框架,并排堆叠 3 张卡片?
- python - Docker-compose Flask, MYSQL PAIN
- ios - ViewController 可以是通用的,包含 IBOutlets 等吗?