【问题标题】:Google App Engine - How return an object to my servlet?Google App Engine - 如何将对象返回到我的 servlet?
【发布时间】:2011-05-16 23:24:27
【问题描述】:

有谁知道我如何将一个对象(更具体地说是 List,来自数据库中的查询的结果)发送到我的 servlet,它是另一个 Java 应用程序,不在 Google App Engine 中。


更新:我在 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":"CIty of Angel"," descicao":"Um belo filme","date":"30/11/2010 13:38:47"},{"id":"30102010115514196289","titulo":"City of Angel","descricao": "Um belo filme","date":"30/11/2010 13:55:14"},{"id":"3010201011561620697","titulo":"City of Angel","descricao":"Um belo filme","date":"30/11/2010 13:56:01"},{"id":"3010201012829669834","titulo":"City of Angel","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":"City of Angel","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) 在 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) 在 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:类类的无参数构造函数。视频不存在。使用 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 更多

不知道怎么回事,谢谢你的帮助。

【问题讨论】:

    标签: java google-app-engine jsp servlets


    【解决方案1】:

    这取决于。如果要将其作为 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:类类的无参数构造函数。视频不存在。

    这很不言自明。提供一个默认构造函数。

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

    【讨论】:

    • 谢谢!我会试试你的建议。
    • 嗨,我照你说的做,正在工作,但是在我的调用 servlet 中我遇到了这个错误:“JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@1b11b79 未能反序列化 json 对象”这个是我在调用 servlet 中的代码: List
    • 跟踪中难道没有更多关于根本原因的信息吗?无论如何,请确保 Video 类在两侧完全相同相同。
    • 这是给出的错误:JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@2d7440 未能反序列化 json 对象 [{"id":"30102010113847691504","titulo":"CIty of Angel","descricao":"Um belo filme","date":"30/11/2010 13:38:47"}, {"id":"3010201012919920893","titulo":"City of Angel" ,"descricao":"Um belo filme","date":"30/11/2010 14:09:19"}] 给定类型 java.util.List
    • 是的,是什么原因造成的?请在堆栈跟踪中进一步查看,根本原因在底部。这只是简单的堆栈跟踪解释。或者,如果您不明白我在说什么,请更新您的问题以包含 entire 堆栈跟踪的完整异常,以at com.example.SomeClass 开头的行等等。
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多