我已经确认我要查找的实体位于数据存储区中。我已经验证了我作为方法参数传递的列表包含此实体。我试图找到所有在我传递的字符串列表中包含'userGmail'的对象。
这是我的代码
@SuppressWarnings("unchecked")
@ApiMethod(name = "findFriendsByEmailList")
public CollectionResponse<ZeppaUser> findFriendsByEmailList(
@Named("emailsList") List<String> emailsList, User user)
throws OAuthRequestException {
if (user == null) {
throw new OAuthRequestException(
"Null User Authorization Exception, findFriendsByEmailList");
}
PersistenceManager mgr = null;
List<ZeppaUser> execute = null;
Query query = null;
try {
mgr = getPersistenceManager();
query = mgr.newQuery(ZeppaUser.class);
query.declareParameters("java.util.List emailListParam");
query.setFilter("emailListParam.contains( userGmail )");
execute = (List<ZeppaUser>) query.execute(emailsList);
query.closeAll();
} finally {
mgr.close();
}
return CollectionResponse.<ZeppaUser> builder().setItems(execute)
.build();
}
这是我收到的堆栈跟踪:
值得注意的是:我在传递的列表中没有收到此错误,因为它不包含数据存储区中找到的元素。就在它确实存在的时候,它让我相信Query已经定位了元素但是没有被正确地关闭或执行到返回参数中。如果最好返回超过ok的List。到目前为止,我尝试了多种变体,但没有成功。它变得非常令人沮丧。
答案 0 :(得分:0)
好的,所以我找到了解决方法。
列表无法传递到ApiEndpoints。我或者我没有找到正确的方法来做这件事,并且喜欢以正确的方式进行更新。
相反,在我的客户端中,我构造了一个由逗号分隔的电子邮件字符串,并将一个字符串作为“编码”字符串列表发送到参数中,然后在执行时“解码”它。效果很好,但看起来很黑。
这是我使用的方法。这很方便,因为它也适用于iOS。
public static String encodeListString(ArrayList<String> stringList){
StringBuilder stringbuilder = new StringBuilder();
stringbuilder.append(stringList.get(0));
if(stringList.size() > 1){
for( int i = 0; i < stringList.size(); i++){
stringbuilder.append(",");
stringbuilder.append(stringList.get(i));
}
}
return stringbuilder.toString();
}
public static List<String> decodeListString(String encodedString){
char[] characters = encodedString.toCharArray();
StringBuilder stringbuilder = new StringBuilder();
int position = 0;
ArrayList<String> stringList = new ArrayList<String>();
while(true){
try {
char character = characters[position];
if(character == ','){
String resultString = stringbuilder.toString();
stringList.add(resultString);
stringbuilder = new StringBuilder(); // clear it
} else {
stringbuilder.append(character);
}
position++;
} catch (ArrayIndexOutOfBoundsException aiex){
// List ended
String resultString = stringbuilder.toString();
if(!resultString.isEmpty())
stringList.add(resultString);
break;
}
}
return stringList;
}