升级App Engine Java SDK后无法打开写入通道

升级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

我正在尝试升级游戏中使用的App Engine SDK版本!web应用程序从1.6.0到1.7.6

升级后,我们无法再将文件写入本地开发服务器的blobstore。我们使用以下代码编写文件:

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;
}
}