読者です 読者をやめる 読者になる 読者になる

slim3のupload/download処理でインデックスが存在しないとエラーが出た。

エラー

ローカルでは正常に動くがサーバにデプロイすると下記のエラーが出た。

org.slim3.controller.Controller runBare: no matching index found.
com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found.
	at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:35)
	at com.google.appengine.api.datastore.DatastoreApiHelper.makeSyncCall(DatastoreApiHelper.java:56)
	at com.google.appengine.api.datastore.DatastoreServiceImpl$PreparedQueryImpl.runQuery(DatastoreServiceImpl.java:341)
	at com.google.appengine.api.datastore.DatastoreServiceImpl$PreparedQueryImpl.access$100(DatastoreServiceImpl.java:268)
	at com.google.appengine.api.datastore.DatastoreServiceImpl$PreparedQueryImpl$1.iterator(DatastoreServiceImpl.java:302)
	at org.datanucleus.store.appengine.DatastoreElementContainerStoreSpecialization.getNumChildren(DatastoreElementContainerStoreSpecialization.java:120)
	at org.datanucleus.store.appengine.DatastoreElementContainerStoreSpecialization.getSize(DatastoreElementContainerStoreSpecialization.java:70)
	at org.datanucleus.store.mapped.scostore.ElementContainerStore.size(ElementContainerStore.java:440)
	at org.datanucleus.sco.backed.List.size(List.java:557)

どうやらupload.getDataList().size();でエラーが出ているようだ。自動で作成されるインデックスがまだ出来ていないのかなと予想した。

一日たったらインデックスはできていた。しかし・・・

管理コンソールでIndexesの画面を確認するとインデックスはできていた。
しかし、エラーになった。なんでだろ??
 
とりあえずsize()を使わないように変更して回避した。

List<UploadData> dataList = upload.getDataList();
ArrayList<byte[]> bytesArray = new ArrayList<byte[]>();
for (UploadData data : dataList) {
    bytesArray.add(data.getBytes());
}
ByteUtil.join(bytesArray.toArray(new byte[bytesArray.size()][0]));