2016-02-22 75 views
18

我已經編寫了以下Hello World Lambda,我正在AWS上通過AWS toolkit for Eclipse在AWS上上傳文件。在Java中爲AWS Lambda執行「Hello World」時出錯

public class HelloWorldLambdaHandler implements RequestHandler<String, String> { 
    public String handleRequest(String input, Context context) { 
     System.out.println("Hello World! executed with input: " + input); 
     return input; 
    } 
} 

我在執行上述代碼時遇到以下錯誤。任何想法我可能做錯了嗎?順便說一句,有這個處理程序的Maven項目沒有任何其他類,只有依賴項是aws-lambda-java-core version 1.1.0。

Skip uploading function code since no local change is found... 
Invoking function... 
==================== FUNCTION OUTPUT ==================== 
{"errorMessage":"An error occurred during JSON parsing","errorType":"java.lang.RuntimeException","stackTrace":[],"cause":{"errorMessage":"com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: [email protected]; line: 1, column: 1]","errorType":"java.io.UncheckedIOException","stackTrace":[],"cause":{"errorMessage":"Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: [email protected]; line: 1, column: 1]","errorType":"com.fasterxml.jackson.databind.JsonMappingException","stackTrace":["com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)","com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835)","com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:59)","com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:12)","com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1441)","com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1047)"]}}} 
+1

您使用什麼有效載荷來測試調用? –

+0

@WillHayworth Payload是空的JSON對象({})。 – Hemant

回答

39

出於某種原因,亞馬遜無法反序列化JSON的字符串。你會認爲字符串和輸入參數一樣通用,但你可以得到它,但是不管它是正確還是錯誤都不兼容。

要處理JSON,您可以使用Map或自定義POJO。

public class HelloWorldLambdaHandler { 
    public String handleRequest(Map<String,Object> input, Context context) { 
     System.out.println(input); 
     return "Hello"; 
    } 
} 
+1

確實你是對的 - 我用一個沒有任何屬性的「Person」類取代了String,並且它工作正常。 – Hemant

+7

這可能是對的,但爲什麼會這樣呢?有沒有任何解釋,因爲文檔本身建議在他們的例子中使用字符串。 AWS的任何人都可以解釋這一點嗎? –

+1

我同意應該改進文檔以解釋被聲明爲String的處理程序輸入參數只接受有效的JSON字符串(即引號括起來的Unicode序列,例如'「foo」'),而不是字符串表示形式一個有效的JSON對象(例如'{「foo」:「bar」}') – fspinnenhirn

8

從堆棧跟蹤讀取錯誤。它說「不能從START_OBJECT標記反序列化java.lang.String的實例」。 「START_OBJECT」標記是「{」。

問題在於你需要傳遞一個實際的String作爲輸入,例如「A String」。這是你的json輸入。不是{}。 {}不是字符串。你不需要任何大括號,只需要一個字符串(用引號括起來)。另一方面,{}是一個有效的Person對象,所以一旦你改變它來處理一個Person作爲輸入,它就起作用了。

+0

恐怕這不是一個正確的答案。 – Cenxui

+0

@Cenxui這實際上是這個問題的正確答案:_「任何想法@Hemnat在用一個空的JSON對象('{}')調用特定的lambda函數時會做錯什麼?」_ – fspinnenhirn

+0

這是正確答案 - if你指定'「{}」'作爲你的Lambda輸入,Lambda會嘗試解析它(即使你的RequestHandler輸入類型是String)。如果你指定'「」'(空字符串),它可以工作。 – Luke