2016-05-20 14 views
1

Ich bin seit einiger Zeit mit diesem Problem beschäftigt. Konnte bisher keine Lösung finden. Basicall Ich mache nichts Außergewöhnliches. Ich habe eine Methode zur Konfiguration und der einen Rest Anfrage mit Wslite und diese Methode akzeptiert die Schließung der Post-Methode Kunden wie diese Karte als Nutzlast senden:WSLITE: Erstellen einer JSON-REST-Anforderung von der Map verursacht StackOverflowError

def postSomething(Map payload){ 

    RESTClient client = new RESTClient("http://somedomain.com/path/") 

    return client.post(accept: ContentType.ANY, 
         headers: [ callTreeId: uuid, jwt: token ]) 
        { 
         json payload 
        } 

} 

Die abgelegte Karte von einer anderen Klasse kommt, die ist verantwortlich für einige Transformation und Erstellen der Karte mit den Daten, die ich posten möchte.

sind die Karten wie folgt strukturiert:

Map data = 
    [ 
     country: "String1", 
     fulfillingStoreId: "String2", 
     customerId: "String3", 
     cardholderId: "String3", 
     deliveryDate: "String4", 
     deliveryAddressId: "String5", 
     serviceType: "String6", 
     paymentType: "String1", 
     source: "String7", 
     origin: 
      [ 
       system: "String8", 
       id: "String9" 
      ] 
     , 

     contactFirstName: "String10", 
     contactLastName: "String11", 
     contactPhoneNumber: "String12", 

     items: [m_itemList] //a list that holds instances of some item objects 

    ] 


    def List <Item> m_itemList = [] 


    class Item { 
     def porperty1 = "" 
     def porperty2 = "" 
     def porperty3 = "" 
    } 

Mit JsonOutput.prettyPrint(JsonOutput.toJson(data)) druckt eine schöne Json String-Darstellung auf die Konsole - sieht alles wie erwartet. Jetzt

, ‚Daten“ Karte auf die Post-Schließung (die Payload) wirft ein "java.lang.StackOverflowError"

Stapel Spur vorbei:

Exception in thread "main" java.lang.StackOverflowError 
at java.util.HashMap.getNode(Unknown Source) 
at java.util.HashMap.get(Unknown Source) 
at java.lang.ClassLoader.getPackage(Unknown Source) 
at java.lang.Package.getPackage(Unknown Source) 
at java.lang.Class.getPackage(Unknown Source) 
at wslite.json.JSONObject.wrap(JSONObject.java:1595) 
at wslite.json.JSONArray.<init>(JSONArray.java:173) 
at wslite.json.JSONObject.wrap(JSONObject.java:1590) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
at wslite.json.JSONObject.<init>(JSONObject.java:292) 
at wslite.json.JSONObject.wrap(JSONObject.java:1606) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
at wslite.json.JSONObject.<init>(JSONObject.java:292) 
at wslite.json.JSONObject.wrap(JSONObject.java:1606) 
at wslite.json.JSONArray.<init>(JSONArray.java:173) 
at wslite.json.JSONObject.wrap(JSONObject.java:1590) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
at wslite.json.JSONObject.<init>(JSONObject.java:292) 
at wslite.json.JSONObject.wrap(JSONObject.java:1606) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
at wslite.json.JSONObject.<init>(JSONObject.java:292) 
at wslite.json.JSONObject.wrap(JSONObject.java:1606) 
at wslite.json.JSONArray.<init>(JSONArray.java:173) 
at wslite.json.JSONObject.wrap(JSONObject.java:1590) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
at wslite.json.JSONObject.<init>(JSONObject.java:292) 
at wslite.json.JSONObject.wrap(JSONObject.java:1606) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
at wslite.json.JSONObject.<init>(JSONObject.java:292) 
at wslite.json.JSONObject.wrap(JSONObject.java:1606) 
at wslite.json.JSONArray.<init>(JSONArray.java:173) 
at wslite.json.JSONObject.wrap(JSONObject.java:1590) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
at wslite.json.JSONObject.<init>(JSONObject.java:292) 
at wslite.json.JSONObject.wrap(JSONObject.java:1606) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
at wslite.json.JSONObject.<init>(JSONObject.java:292) 
at wslite.json.JSONObject.wrap(JSONObject.java:1606) 
at wslite.json.JSONArray.<init>(JSONArray.java:173) 
at wslite.json.JSONObject.wrap(JSONObject.java:1590) 
at wslite.json.JSONObject.populateMap(JSONObject.java:1012) 
... 
... 
... 

Ich verstehe, dass der Content der wslite Client nimmt eine Karte, und ich habe es vorher mit anderen getan (einfacher) -Anforderungen. Also, was das Problem sein könnte?

Sie für Ihre Beiträge Vielen Dank im Voraus.

UPDATE/WORKAROUND LÖSUNG:

Also nach etwas graben dachte ich, den gebauten json einfach mit dem JsonSlurper wieder zu schlürfen, bevor ich ihn zum Inhaltsaufbau clossure da das "prettyPrinting" die Karte korrekte Ergebnisse zeigt. Voila! Keine StackOverFlow-Ausnahme mehr.

Ich jetzt die Karte mit dem JsonBuilder und analysieren das Ergebnis (String) mit dem JsonSlurper, schließlich übergeben Sie dies an WSLITE Content Builder.

+0

Welche Version von WSLITE verwenden Sie? –

+0

Version 1.1.2. Ich wechsle zu 2.0, um zu sehen, ob das Problem bestehen bleibt und es tut! –

Antwort

0

Ich hatte gerade das gleiche Problem. Stellt sich heraus, meine payload Karte hatte Werte, die keine Strings waren (sie waren UUIDs und Enums, die normalerweise automatisch toString()). Wenn ich die Werte manuell in Strings umwandelte, ging der Fehler verloren.

payload.each { k, v -> payload[k] = v.toString() }