0

我已验证我要查找的实体在数据存储区中。我已验证我作为方法参数传递的列表包含此实体。我正在尝试查找在我传递的字符串列表中包含其“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 已经找到了元素,但没有正确关闭或执行到返回参数中。如果最好返回列表,那就太好了。到目前为止,我已经尝试了多种变体,但没有成功。它变得非常令人沮丧。

4

1 回答 1

0

好的,所以我找到了解决方法。

列表不能传递到 ApiEndpoints。那或者我没有找到正确的方法来做到这一点,并且希望更新正确的方法来做到这一点。

相反,在我的客户端中,我构造了一个用逗号分隔的电子邮件字符串,并将一个字符串作为“编码”字符串列表发送到参数中,然后在执行时“解码”它。效果很好,但看起来很hacky。

这是我使用的方法。这很方便,因为它也适用于 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;

}
于 2014-02-12T22:20:37.353 回答