Wrapperclass'a eşleme ile listeyi seri durumdan çıkarma

Aug 18 2020

Bir wrapperclass / nesneye serisini kaldırmaya çalıştığım bir dizem var. Ama hatayı al:

Expected Map<String,String> but found [line:1, column:3]

Wrapperclass

global class Invocable_Obj_HandleInvoice  {
    @AuraEnabled global Id invoiceId;
    @AuraEnabled global string invoiceNumber;
    @AuraEnabled global decimal balanceAmount;
    @AuraEnabled global decimal totalAmount;
    @AuraEnabled global string customerName;
    @AuraEnabled global string zuoraStatus;
    @AuraEnabled global string handlingStatus;
    @AuraEnabled global string selectedOption;
    @AuraEnabled global Map<String, String> availableOptions;
}

Dize

[
  {
    "availableOptions": [
      {
        "key": "e",
        "value": "f"
      },
      {
        "key": "g",
        "value": "z"
      }
    ],
    "balanceAmount": -100,
    "customerName": "Test",
    "handlingStatus": "New",
    "invoiceId": "a0S2o000023CSHoEAO",
    "invoiceNumber": "INV-001",
    "selectedOption": "A",
    "totalAmount": -100,
    "zuoraStatus": "Posted"
  },
  {
    "availableOptions": [
      {
        "key": "a",
        "value": "x"
      },
      {
        "key": "b",
        "value": "y"
      },
      {
        "key": "c",
        "value": "z"
      }
    ],
    "balanceAmount": -100,
    "customerName": "Test",
    "handlingStatus": "New",
    "invoiceId": "a0S2o000023CSHoEAO",
    "invoiceNumber": "INV-001",
    "selectedOption": "y",
    "totalAmount": -100,
    "zuoraStatus": "Posted"
  }
]

Apeks

 system.debug((List<Invocable_Obj_HandleInvoice>) System.JSON.deserialize(invoices, List<Invocable_Obj_HandleInvoice>.class));  

Yıldırım bileşenine geçen liste

 List<Invocable_Obj_HandleInvoice> hiList = new List<Invocable_Obj_HandleInvoice>();
    Invocable_Obj_HandleInvoice  hi1 =  new Invocable_Obj_HandleInvoice(); 
    hi1.invoiceId = zi[0].id;
    hi1.invoiceNumber = zi[0].Name; 
    hi1.balanceAmount = zi[0].Zuora__Balance2__c;
    hi1.totalAmount = zi[0].Zuora__TotalAmount__c;
    hi1.customerName = 'Test';
    hi1.zuoraStatus = zi[0].Zuora__Status__c; 
    hi1.handlingStatus = zi[0].Handling_Status__c;
    hi1.selectedOption = 'A'; 
    hi1.availableOptions = new Map<String,string> {'e'=>'f', 'g'=> 'z'}; 
    hiList.add(hi1); 
return hiList;

Yıldırım kontrolörü

var act = cmp.get("c.updateInvoices");
var updatedInvoiceList = JSON.stringify(cmp.get('v.handleInvoices'));
act.setParams({ "invoices" : updatedInvoiceList});
$A.enqueueAction(act); 

Bileşen <aura: attribute type = "List" name = "handleInvoices" />

Yıldırım kontrolörü

doInit : function(cmp, event, helper) {
        var action = cmp.get("c.testHandlInvoice");
        
        action.setCallback(this, function(response) {
            var state = response.getState();
            if (state === "SUCCESS") {
                cmp.set('v.handleInvoices', response.getReturnValue());
                console.log(cmp.get('v.handleInvoices'));
            }
            
        });
        $A.enqueueAction(action);
    },

console.log

availableOptions: Array(3)
0: {key: "a", value: "x"}
1: {key: "b", value: "y"}
2: {key: "c", value: "z"}
length: 3
__proto__: Array(0)
balanceAmount: -100
customerName: "Test"
handlingStatus: "New"
invoiceId: "a0S2o000023CSHoEAO"
invoiceNumber: "INV-001"
selectedOption: "A"
totalAmount: -100
zuoraStatus: "Posted"

GÜNCELLEME ***** Bu konuya çarpan herkes için, aşağıdaki cevabın haritanın sorununu ele aldığını anladım, ancak sınırlandırmadan sonra harita hala değiştirildi, bu yüzden nesneyi doğrudan geçerek bu çözümü birleştirmeyi bitirdim: Bir nesneden nasıl geçilir? Apex Denetleyici yöntemine Yıldırım Bileşeni yardımcısı

  var act = cmp.get("c.updateInvoices");
        var tempInvoiceList = cmp.get('v.handleInvoices');
        tempInvoiceList = tempInvoiceList.slice(); // copy
        tempInvoiceList = tempInvoiceList.map(function(invoice) { return Object.assign({}, invoice); }); // copy deeper
        act.setParams({ "invoices" : tempInvoiceList});
        tempInvoiceList = tempInvoiceList
        .forEach(function(invoice) { 
            invoice.availableOptions = invoice.availableOptions
            .reduce(function(prev, option) { 
                prev[option.key] = option.value; 
                return prev;
            }, 
                    {})
        }
                );
        $A.enqueueAction(act); 

Yanıtlar

3 sfdcfox Aug 18 2020 at 19:40
@AuraEnabled global Map<String, String> availableOptions;

Olmalı:

@AuraEnabled global List<Map<String,String>> availableOptions;

Veya:

@AuraEnabled global List<KeyValuePair> availableOptions;

Nerede KeyValuePair:

public class KeyValuePair {
  @AuraEnabled public String key;
  @AuraEnabled public String value;
}

Kodda yeterince yaygın olarak kullanılan, aslında geliştirici kuruluşumda üst düzey bir sınıf olarak buna sahibim; Seçim listesi değerleri için oldukça sık kullanıyorum.

Bu tür bir JSON genellikle önerilmez, ancak bu şekilde kullanmanız gerekiyorsa, bu tercih edilen formdur. Orijinal Apex'inizi kullanmak için şu şekilde biçimlendirilmesi gerekir:

"availableOptions": { "e": "f", "g", "z" },

JSON'un genel anlamda biçimlendirilmesi amaçlanmıştır, ancak önceki form, bir değeri ve etiketi olan seçim listesi seçenekleri gibi durumlar için kabul edilebilir.


"Kullanılabilir Seçeneklerinizi" doğru şekilde kullanmak için tekrar uygun bir haritaya dönüştürmeniz gerekiyor gibi görünüyor:

var act = cmp.get("c.updateInvoices");
var tempInvoiceList = cmp.get('v.handleInvoices');
tempInvoiceList = tempInvoiceList.slice(); // copy
tempInvoiceList = tempInvoiceList.map(function(invoice) { return Object.assign({}, invoice); }); // copy deeper
tempInvoiceList = tempInvoiceList
  .forEach(function(invoice) { 
    invoice.availableOptions = invoice.availableOptions
      .reduce(function(prev, option) { 
         prev[option.key] = option.value; 
         return prev;
      }, 
      {})
    }
  );
var updatedInvoiceList = JSON.stringify(tempInvoiceLIst);
act.setParams({ "invoices" : updatedInvoiceList});
$A.enqueueAction(act); 
DerekF Aug 18 2020 at 19:41

availableOptions JSON'nizde bir harita değil, nesnelerin bir listesidir ("anahtar" ve "değer" alanları ile).

Yani, sarmalayıcı sınıfınızın bunu yansıtması gerekiyor. A yerine Map<String, String>, hedef verileri ("anahtar" ve "değer") tutabilecek başka bir sınıfın / türünün bir listesi yapmanız gerekir.