Google App Engine - Как вернуть объект в мой сервлет? - PullRequest
2 голосов
/ 28 ноября 2010

Кто-нибудь знает, как я могу отправить объект, а точнее List, результат запроса в базе данных, в мой сервлет, который является другим приложением Java и отсутствует в Google App Engine.


Обновление : Мой сервлет в GAE работает нормально, он сериализует мой List<Video> результат:

public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {

    String titulo = req.getParameter("titulo");
    String json = "";

    PersistenceManager pm = PMF.get().getPersistenceManager();
    Query query = pm.newQuery("select from "+Video.class.getName()+ " where titulo.startsWith('"+titulo+"')");
    List<Video> video = (List<Video>) pm.newQuery(query).execute();

    json = new Gson().toJson(video);
    System.out.println("SERIALIZED >> " + json);

    res.setContentType("application/json");
    res.setCharacterEncoding("UTF-8");
    res.getWriter().write(json);
}

Мой вызывающий сервлет имеет этот метод:

public void receberMetaDados(String titulo) throws IOException, Exception{
    InputStream input = new URL("http://localhost:8888/serve?titulo="+titulo).openStream();
    Reader reader = new InputStreamReader(input, "UTF-8");
    List<Video> results = new Gson().fromJson(reader, new TypeToken<List<Video>>(){}.getType());
}

Я получаю следующее исключение:

com.google.gson.JsonParseException: JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@2d7440 не удалось десериализовать объект json [{"id": "30102010113847691504", "titulo": "CITY" descricao ":" Um belo filme "," date ":" 30/11/2010 13:38:47 "}, {" id ":" 30102010115514196289 "," titulo ":" Город Ангела "," descricao ": "Um belo filme", ​​"date": "30/11/2010 13:55:14"}, {"id": "3010201011561620697", "titulo": "Город Ангела", "descricao": "Um belo filme "," date ":" 30/11/2010 13:56:01 "}, {" id ":" 3010201012829669834 "," titulo ":" Город Ангела "," descricao ":" Um belo filme ", "date": "30/11/2010 14:08:29"}, {"id": "3010201012849669427", "titulo": "CIty of Angel", "descricao": "Um belo filme", ​​"date" : "30/11/2010 14:08:49"}, {"id": "3010201012919920893", "titulo": "Город ангелов", "descricao": "Um belo filme", ​​"date": "30 / 11/2010 14:09:19 "}] с типом java.util.List на com.google.gson.JsonDeserializerExceptionWrapper.deserialize (JsonDeserializerExceptionWrapper.java:63) на com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer (JsonDeserializationVisitor.java:88) на com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler (JsonDeserializationVisitor.java:76) на com.google.gson.ObjectNavigator.accept (ObjectNavigator.java:106) в com.google.gson.JsonDeserializationContextDefault.fromJsonArray (JsonDeserializationContextDefault.java:64) на com.google.gson.JsonDeserializationContextDefault.deserialize (JsonDeserializationContextDefault.java:49) на com.google.gson.Gson.fromJson (Gson.java:568) на com.google.gson.Gson.fromJson (Gson.java:515) на com.google.gson.Gson.fromJson (Gson.java:484) в классах. Manip.receberMetaDados (Manip.java:64) at servlet.OurTube_Servlet.buscar (OurTube_Servlet.java:105) at servlet.OurTube_Servlet.doPost (OurTube_Servlet.java:55) на javax.servlet.http.HttpServlet.service (HttpServlet.java:637) на javax.servlet.http.HttpServlet.service (HttpServlet.java:717) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:290) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:233) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:191) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:127) в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:109) в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:298) в org.apache.coyote.http11.Http11Processor.process (Http11Processor.java:857) в org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process (Http11Protocol.java:588) в org.apache.tomcat.util.net.JIoEndpoint $ Worker.run (JIoEndpoint.java:489) на java.lang.Thread.run (Thread.java:662) Вызывается: java.lang.RuntimeException: конструктор без аргументов для классов классов. Видео не существует. Зарегистрируйте InstanceCreator в Gson для этого типа, чтобы решить эту проблему. на com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor (MappedObjectConstructor.java:64) на com.google.gson.MappedObjectConstructor.construct (MappedObjectConstructor.java:53)на com.google.gson.JsonObjectDeserializationVisitor.constructTarget (JsonObjectDeserializationVisitor.java:40) на com.google.gson.JsonDeserializationVisitor.getTarget (JsonDeserializationVisitor.java:56) на com.google.gson.ObjectNavigator.accept (ObjectNavigator.java:109) на com.google.gson.JsonDeserializationContextDefault.fromJsonObject (JsonDeserializationContextDefault.java:73) на com.google.gson.JsonDeserializationContextDefault.deserialize (JsonDeserializationContextDefault.java:51) на com.google.gson.DefaultTypeAdapters $ CollectionTypeAdapter.deserialize (DefaultTypeAdapters.java:548) на com.google.gson.DefaultTypeAdapters $ CollectionTypeAdapter.deserialize (DefaultTypeAdapters.java:510) на com.google.gson.JsonDeserializerExceptionWrapper.deserialize (JsonDeserializerExceptionWrapper.java:50) ... еще 25

Я не знаю, что не так, спасибо вам за помощь.

1 Ответ

6 голосов
/ 28 ноября 2010

Это зависит. Если он должен быть возвращен как HTTP-ответ на HTTP-запрос, вам необходимо преобразовать его в строку, соответствующую определенному формату. Самые популярные из них - XML ​​и JSON. Другой конец должен просто прочитать строку XML или JSON, а затем воссоздать список на основе этой информации.

Вот пример с JSON и Google Gson , который способен конвертировать объекты Java в JSON и наоборот.

Вызываемый сервлет:

List<Result> results = someDAO.list();
String json = new Gson().toJson(list);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);

Вызывающий сервлет:

InputStream input = new URL("http://example.com/servleturl").openStream();
Reader reader = new InputStreamReader(input, "UTF-8");
List<Result> results = new Gson().fromJson(reader, new TypeToken<List<Result>>(){}.getType());

Обновление : согласно исключению:

Причина: java.lang.RuntimeException: конструктор без аргументов для классов классов. Видео не существует.

Это довольно понятно. Укажите конструктор по умолчанию.

public class Video {
    public Video() {
        // Always keep default c'tor alive whenever you
        // supply another c'tor in a Javabean class.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...