0

Я пытаюсь обновить версию SDK приложения, которую мы используем для нашей игры! веб-приложения с 1,6 до 1,7,6.Невозможность открыть канал записи после обновления App Engine Java SDK

После обновления мы больше не можем записывать файлы в 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) 

Хотя SDK из App Engine является открытым исходным кодом, я не могу найти источник файлы для этих классов, ориентированных на развитие, чтобы узнать, что происходит внутри.

Кто-нибудь знает, изменились ли детали реализации для записи объектов в blobstore с версии 1.6.0?

ответ

0

Получается, что это Play! конкретной проблемы. Модуль play-gae реализует свой собственный LocalServerEnvironment для App Engine, называемый PlayDevEnvironment. Он содержит метод получения списка атрибутов. Между версией 1.6.0 и 1.7.7 App Engine было внесено изменение, в котором необходимо было вернуть дополнительные атрибуты. Мы решили это, изменив этот класс следующим образом:

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; 
    } 
} 
Смежные вопросы