我写了一个小应用程序,在本地环境中工作没有任何问题,但是在我将应用程序部署到Google App Engibe后,它停止了工作。这是客户端的代码:
CollectionResponseLong asd = null;
try {
asd = getEndpoint().getClosePeople(id).execute();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
我可以看到它在服务器端也可以使用以下代码:
@SuppressWarnings({ "unchecked", "unused" })
@ApiMethod(name = "getClosePeople",path = "getClosePeople")
public CollectionResponse<Long> getClosePeople(@Named("id") Long id) {
PersistenceManager mgr = getPersistenceManager();
Cursor cursor = null;
List<Long> execute = null;
String cursorString = null;
Integer limit = null;
User user = mgr.getObjectById(User.class, id);
mgr = getPersistenceManager();
Query query = mgr.newQuery(User.class);
if (cursorString != null && cursorString != "") {
cursor = Cursor.fromWebSafeString(cursorString);
HashMap<String, Object> extensionMap = new HashMap<String, Object>();
extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);
query.setExtensions(extensionMap);
}
// query.setFilter("GeoHash == '" + user.getGeoHash() +"'" + " && Id != " + id);
query.setFilter("GeoHash == '" + user.getGeoHash() +"'" + " && Id != " + id);
query.setResult("Id");
if (cursorString != null && cursorString != "") {
cursor = Cursor.fromWebSafeString(cursorString);
HashMap<String, Object> extensionMap = new HashMap<String, Object>();
extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);
query.setExtensions(extensionMap);
}
if (limit != null) {
query.setRange(0, limit);
}
execute = (List<Long>) query.execute();
cursor = JDOCursorHelper.getCursor(execute);
if (cursor != null)
cursorString = cursor.toWebSafeString();
for (Long obj : execute)
;
System.out.println("STRING " + execute.toString());
mgr.close();
System.out.println(CollectionResponse.<Long> builder().setItems(execute)
.setNextPageToken(cursorString).build().getItems().toString());
return CollectionResponse.<Long> builder().setItems(execute)
.setNextPageToken(cursorString).build();
}
我可以在服务器端的日志中看到,在返回语句之前没有问题,因为System.out打印了我想要的响应。但是我在eclipse上遇到以下错误,有趣的是Google app引擎管理控制台上没有错误日志
com.google.api.client.googleapis.json.GoogleJsonResponseException:500内部服务器错误:
未设置应用程序名称。调用Builder#setApplicationName。 com.google.api.client.googleapis.json.GoogleJsonResponseException:500内部服务器错误 { “代码”:500, “错误”:[{ “域名”:“全球”, “消息”:“内部错误”, “reason”:“internalError” }], “消息”:“内部错误” } 在com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) 在com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) 在com.google.api.client.googleapis.services.AbstractGoogleClientRequest $ 1.interceptResponse(AbstractGoogleClientRequest.java:312) 在com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1045) 在com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410) 在com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343) 在com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
谢谢,
我已经找到了解决方案,我希望它能帮助人们面对同样的问题:)
只是你不能使用String作为回报。而已。 尽管它在开发环境中没有任何问题,但在部署之后(在Google生产环境中)它将无法工作。 我为此创建了两个单独的对象,一个用于String,另一个用于String [],名为StringObject和StringArrayObject,每当我想返回数组或字符串时,我都会使用这些方法。
答案 0 :(得分:0)
消息“应用程序名称未设置”表明在AppEngine内部,一个包含应用程序ID的变量可能包含null。正如@nebulae评论的那样,检查的地方是appengine-web.xml。但是,部署了应用程序,因此应用程序ID可能不为空。在Eclipse中,要查看的是项目属性 - &gt; Google - &gt; AppEngine - &gt;部署当然。
问题第一句中的一些文字是腐败的,并暗示字符集存在问题:“GoogleAppEbgşbe”而不是“Google App Engine”。现在,如果部署有效,但生产运行时崩溃,则部署可以处理的应用程序ID中可能存在一些字符,但运行时不能。
因此,我建议您创建一个不同的应用程序ID,只包含绝对安全的字符,用它更新项目属性,然后尝试再次部署和运行。
答案 1 :(得分:0)
我无法找到解决方案,因此我在cloudEndpoint.getResult()
方法上添加了3次重试。
每当它随机失败时,它主要在第二次重试时起作用。