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();

}

これは、私が受け取るスタック トレースです。 ここに画像の説明を入力

注目すべき点: データストアで見つかった要素を含まないために渡したリストでは、このエラーは発生しません。それが存在するときに、クエリが要素を見つけたが、閉じられていないか、戻りパラメーターに正しく実行されていないと思います。それ以上のリストを返すことが望ましい場合は、問題ありません。これまでに複数のバリエーションを試しましたが、成功していません。それはかなりイライラしています。

4

1 に答える 1

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;

}
于 2014-02-12T22:20:37.353 に答える