升级App Engine Java SDK后无法打开写入通道
我正在尝试升级游戏中使用的App Engine SDK版本!web应用程序从1.6.0到1.7.6 升级后,我们无法再将文件写入本地开发服务器的blobstore。我们使用以下代码编写文件:升级App Engine Java SDK后无法打开写入通道,java,google-app-engine,playframework,google-cloud-datastore,playframework-1.x,Java,Google App Engine,Playframework,Google Cloud Datastore,Playframework 1.x,我正在尝试升级游戏中使用的App Engine SDK版本!web应用程序从1.6.0到1.7.6 升级后,我们无法再将文件写入本地开发服务器的blobstore。我们使用以下代码编写文件: Image img = ImagesServiceFactory.makeImage(uploadedData); FileService fileService = FileServiceFactory.getFileService(); AppEngineFile file = fileService
Image img = ImagesServiceFactory.makeImage(uploadedData);
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile("image/png", "__initial_data/" + vf.getName());
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
OutputStream output = Channels.newOutputStream(writeChannel);
调用fileService.openWriteChannel
失败,堆栈跟踪如下:
Caused by: java.lang.NullPointerException
at com.google.appengine.tools.development.RequestEndListenerHelper.register(RequestEndListenerHelper.java:39)
at com.google.appengine.api.files.dev.LocalFileService.open(LocalFileService.java:247)
at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.callInternal(ApiProxyLocalImpl.java:527)
at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:481)
at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:458)
at java.util.concurrent.Executors$PrivilegedCallable$1.run(Executors.java:461)
at java.security.AccessController.doPrivileged(Native Method)
at java.util.concurrent.Executors$PrivilegedCallable.call(Executors.java:458)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:680)
虽然AppEngine的SDK是开源的,但我找不到这些开发特定类的源文件来了解内部的情况
有人知道自1.6.0版以来,将对象写入blobstore的实现细节是否发生了变化吗?事实证明,这是一个重头戏!具体问题。play gae模块为应用程序引擎实现了自己的LocalServerEnvironment,称为
PlaydevenEnvironment
。它包含一个获取属性列表的方法。在AppEngine的1.6.0版和1.7.7版之间进行了更改,需要返回其他属性。我们通过以下方式更改该类来解决此问题:
public class PlayDevEnvironment implements Environment, LocalServerEnvironment {
...
@Override
public Map<String, Object> getAttributes() {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put(LocalEnvironment.REQUEST_END_LISTENERS, new ArrayList<RequestEndListener>());
return hashMap;
}
}
public类PlayDevEnvironment实现环境LocalServerEnvironment{
...
@凌驾
公共映射getAttributes(){
HashMap HashMap=新的HashMap();
put(LocalEnvironment.REQUEST_END_侦听器,new ArrayList());
返回hashMap;
}
}