TableEntity сохраняется только частично в таблице хранения auzre - PullRequest
0 голосов
/ 27 апреля 2019

Я наблюдаю очень странное поведение при сохранении сущности таблицы в таблице хранения 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», сохраняется только мета, а 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 даже не определено в Entity.

enter image description here

Я нахожусь в Java 7 и использую эту зависимость: 'com.microsoft.azure:azure-storage:7.0.0'

ОБНОВЛЕНИЕ Обнаружено, что из-за перегрузки метода у меня было два варианта сеттеров: один для строки, а другой для карты.Если я удаляю перегруженный метод для карты, все работает, что все еще не объясняет, почему он работал бы для «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));
    }

1 Ответ

0 голосов
/ 04 мая 2019

Обнаружено, что это из-за перегрузки метода, у меня было два варианта сеттеров: один для строки, а другой для карты. Если я удаляю перегруженный метод для 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;
    }


...