是否有人知道如何发送一个对象,更具体的是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个
我不知道出了什么问题,谢谢你的协助。
答案 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.
}
}