Google App Engine - 如何将对象返回给我的servlet?

时间:2010-11-28 20:10:49

标签: java google-app-engine jsp servlets

是否有人知道如何发送一个对象,更具体的是List,一个来自数据库中的查询的结果,发送到我的servlet,这是另一个Java应用程序而不是Google App Engine。< / p>


更新:我在GAE中的servlet工作正常,它序列化我的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);
}

我的调用servlet有这个方法:

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”:“天使之城”,“ descricao“:”Um belo filme“,”date“:”30/11/2010 13:38:47“},{”id“:”30102010115514196289“,”titulo“:”天使之城“,”descricao“: “嗯belo filme”,“date”:“30/11/2010 13:55:14”},{“id”:“3010201011561620697”,“titulo”:“天使之城”,“descricao”:“嗯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”:“天使之城”,“descricao”:“Um belo filme”,“date” :“30/11/2010 14:08:49”},{“id”:“3010201012919920893”,“titulo”:“天使之城”,“descricao”:“Um belo filme”,“date”:“30 / 11/2014 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)       在classes.Manip.receberMetaDados(Manip.java:64)       在servlet.OurTube_Servlet.buscar(OurTube_Servlet.java:105)       在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)       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)       在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)       at 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:类类的No-args构造函数.Video不存在。使用Gson为此类型注册InstanceCreator以解决此问题。       在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 个答案:

答案 0 :(得分:6)

这取决于。如果要在HTTP请求上作为HTTP响应返回,则需要将其转换为遵循特定格式的字符串。流行的是XML和JSON。另一端只需读取XML或JSON字符串,然后根据此信息重新创建列表。

以下是JSON和Google Gson的示例,它可以将Java对象转换为JSON,反之亦然。

被调用的servlet:

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

调用servlet:

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:类类的No-args构造函数.Video不存在。

这是非常自我解释的。提供默认构造函数。

public class Video {
    public Video() {
        // Always keep default c'tor alive whenever you
        // supply another c'tor in a Javabean class.
    }
}