2016-04-13 2 views
2

Я новичок в Java, поэтому это не может быть связано с AWS лямбдой вообще. Тем не менее, лямбда принимает такие свободы с объектами ввода/вывода, которые я предполагаю, что это преступник.AWS lambda java response не поддерживает вложенные объекты?

Я строй своей первой функции лямбды и хочу вернуть простую структуру JSON (упрощенную далее в данном примере):

{ 
    "document" : "1", 
    "person" : { "name" : "John Doe" } 
} 

Однако, когда лямбда сериализует JSON всегда устанавливает «лицо» к пустой объект!

{ 
    "document": "1", 
    "person": {} 
} 

Вот мой код в полном объеме:

- test1.java 
package handler_test; 
import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 
public class test1 implements RequestHandler<String, ResponseClass> { 
    @Override 
    public ResponseClass handleRequest(String input, Context context) { 
     return new ResponseClass(); 
    } 
} 

- ResponseClass.java 
package handler_test; 
import org.json.JSONException; 
import org.json.JSONObject; 
public class ResponseClass { 
    String document; 
    JSONObject person; 

    public String getdocument() { 
     return "1"; 
    } 

    public JSONObject getperson() { 
     try { 
      return new JSONObject("{ \"name\" : \"John Doe\" }"); 
     } catch (JSONException e1) { 
      System.out.println("error creating jsonobject"); 
      return null; 
     } 
    } 

    public ResponseClass() { 
    } 
} 

Я попытался это десятки вариаций, используя объекты вместо JSONObjects, превращая getperson вывод в строку (которая работает, если я хотел строка) и т. д. Если я сохраню значения и распечатаю их в журнале, это нормально. Но как только я пытаюсь вернуть его через лямбда, он становится грушевидным. Я прикрепил сеть и не могу найти ничего более на объектах AWA-лямбда-джава за пределами кода примера приветствия Amazon, который включает только две строки. Любые предложения очень ценятся!

+0

см это http://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html, http://docs.aws.amazon.com/ – Unknown

+0

Также этот http://docs.aws.amazon.com/lambda/latest/dg/java-handler-using-predefined-interfaces.html – Unknown

+0

Благодарю. Это код примера «приветствия», на который я ссылаюсь, который возвращает только простой объект. AWS не имеет образцов возврата чего-либо более сложного. Они упоминают, что если сериализация из коробки не работает для вас, вы можете написать свою собственную сериализацию JSON, но не говорите, как это сделать! Будучи новичком в java и лямбда, я в недоумении. (И, честно говоря, возвращение объекта JSON внутри объекта JSON не похоже на такой необычный запрос, что мне придется свернуть мои собственные инструменты, хотя никто больше не делает этого в лямбда.) – Gregg

ответ

1

Вы можете пропустить JSONObject и использовать POJO для вложенного класса. Тем не менее, назначение имен в соответствии с соглашениями важно здесь. Убедитесь, что ваши методы доступа названы с помощью верблюжьего случая (получите + имя свойства, заглавное). Попробуйте следующее:

public class ResponseClass { 
    String document; 
    Person person; 

    public String getDocument() { 
     return "1"; 
    } 

    public Person getPerson() { 
     return person; 
    } 
} 

class Person { 
    String name; 
    public String getName() { 
     return name; 
    } 
} 
+0

К сожалению, это не создает вложенный объект, а только ключ верхнего уровня; например: { «документ»: «1», «человек»: «John Doe» } Если изменить класс Person, чтобы вернуть объект JSON (который является то, что я хочу) Я получаю те же результаты: пустой объект «человек». { "документ": "1", "лицо": {} } – Gregg

+0

@Gregg: столкнулся с аналогичной проблемой. Определение конструктора по умолчанию в POJO решит это. – OneWorld

2

Я решил это использовать обработчики потока, и это не только работает, но и у вас больше контроля и меньше кода! Я использовал gson для сериализации/десериализации JSON и Apache IOUtils для преобразования inputsteam в строку. Поскольку я уже писал это с использованием классов Request and Response, я продолжал использовать их, хотя мне удалось избавиться от всего кода getter и setter.

Два замечания: 1. gson будет выводить все непустые атрибуты класса Response, даже , если они объявлены закрытыми, так что если есть значения, которые вы не хотите косы обратно не забудьте установить их до нуля до последней строки. 2. При использовании Eclipse IDE с плагином AWS он не будет загружать код в AWS, если он не сможет найти RequestHandler! Таким образом, у меня есть функция заглушки, которая немедленно переопределяется.

import com.google.gson.*; 
import org.apache.commons.io.IOUtils; 
import com.amazonaws.services.lambda.runtime.*; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 

public class Intel implements RequestStreamHandler, RequestHandler<Object, Object> { 
    @Override 
    public Object handleRequest(Object input, Context context) { 
     return null; 
    } 

    @Override 
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { 
     Request req = new Gson().fromJson(IOUtils.toString(inputStream, "UTF-8"), Request.class); 
     Response resp = new ResponseClass(); 
      resp.id = 1; 
      resp.person.name = req.name; 
      et_home_phone(req.name); 
     outputStream.write(new Gson().toJson(resp).getBytes(Charset.forName("UTF-8"))); 
    } 

    private void get_home_phone(String name) { 
     // call external API -- stub example! Assumes only one phone returned 
     // in the format { "number" : "123-456-7890", "type" = "home" } 
     // gson magic assures they get copied to the keys of the same name 
     HttpGet httpGet = new HttpGet(phoneURL + "/" + name)); 
     HttpResponse httpResponse = client.execute(httpGet); 
     resp.phone[0] = new Gson().fromJson(IOUtils.toString(httpResponse .getEntity().getContent(), "UTF-8"), Response.Phone.class); 
    } 
} 

public class Response { 
    public class Person { 
     String name; 
    } 
    public class Phone { 
     String number; 
     String type; 
    } 
    public Integer id; 
    public Person person = new Person(); 
    public Phone[] phone = new Phone[5]; 
} 
+0

Я думаю, вы должны принять свой собственный ответ. Это разрешено AFAIK. – FuleSnabel

Смежные вопросы