0

だから私はrestletで初めてです。私はGAEサーバーと通信できるAndroidアプリケーションを作成しています(objectify DBを使用

それは非常にうまく機能していますが、ほとんど効果がありません。唯一の2つの方法:

public interface UserControllerInterface {
@Put
void create(User user);
@Get
Container getAllUsers();
}

私のアプリケーションではより複雑なので、さらに多くのメソッドを追加します。

public interface UserControllerInterface {
@Put
public void createUser(ObagooUser user);

@Put
public void createMessage(ObagooUser user, String message);

@Put
public void updateMessage(ObagooMessage message);

@Get
public List<ObagooUser> getAllUser();

@Get
public ObagooUser getUserById(String id);

@Get
public List<ObagooMessage> getAllMessage();

@Get
public List<ObagooMessage> getAllMessageFromSender(ObagooUser sender);

@Get
public ObagooMessage getFreeMessage(ObagooUser user);
}

これらの mothd はそれぞれサーバー側で動作します (私は Junit でテストしました)。

今、私はアンドロイドの部分をコーディングしていますが、問題があります。getAllMessage() への単純な呼び出しを行うと、エラーが発生します。

java.lang.IllegalArgumentException: id cannot be zero
at com.google.appengine.api.datastore.KeyFactory.createKey(KeyFactory.java:44)
at     com.googlecode.objectify.ObjectifyFactory.typedKeyToRawKey(ObjectifyFactory.java:269)
at com.googlecode.objectify.impl.ObjectifyImpl.find(ObjectifyImpl.java:159)
at com.googlecode.objectify.impl.ObjectifyImpl.find(ObjectifyImpl.java:183)
at com.obagoo.dao.ObagooUserDAO.getUserById(ObagooUserDAO.java:43)
at com.obagoo.controller.ObagooController.getUserById(ObagooController.java:47)

間違ったメソッド (getUserById) で行われています。

getAllMessage にブレークポイントを設定すると、それが入りますが、他のメソッドにも入ります。

何度もテストすると、createUser または別のランダムなメソッドが呼び出されることがあります。

私が間違っていることがわかりますか?

getAllMessage コードを追加します。

public List<ObagooMessage> getAllMessage() {
    // logger.debug("Getting all Obagoo Messages");

    List<ObagooMessage> msg = new ArrayList<ObagooMessage>();
    Objectify ofy = ObjectifyService.begin();

    Query<ObagooMessage> q = ofy.query(ObagooMessage.class);

    for (ObagooMessage u : q) {
        msg.add(u);
    }

    return msg;
}
4

2 に答える 2

1

私が見た例では、リスト リソースのcontroller/resource処理を単一アイテム ( /ベース) リソースから分離する必要があることが常に示されています。したがって、次のようなものになります。URIidname

router.attach("/users", UsersController.class);
router.attach("/users/{id}", UserController.class
router.attach("/messages", MessagesController.class);

UsersController最初の class: の複数形の命名と、2 番目の class: の単数形の命名に注目してくださいUserController。最初のクラスは、すべてのユーザーの取得など、ID が提供されていないケースを処理します。また、id が で提供される場合URI、クラスの id フィールドに自動的にマップされることに注意してください。したがって、Getメソッドにはメソッド呼び出しのパラメーターがありません。

サブセットの処理については、特定のユーザーからのメッセージについては、クエリ パラメーターで処理できます。たとえば、URIwithを介して呼び出す場合/messages?sender=idMessagesController.classは Get を処理するメソッドで次を使用します。

Form queryParams = getRequest().getResourceRef().getQueryAsForm(); 
String id = queryParams.getFirstValue("sender"); 

それが役立つことを願っています。私は専門家ではないので、どなたでもお気軽に訂正してください。

于 2012-08-28T14:00:04.793 に答える
0

エラーが示すように: ID がゼロのキーを作成しています。

私の推測では、あなたのObagoMessageId フィールドはlong? あなたはそれを作るべきLongです。プリミティブlongId 値は自動生成されませんが、オブジェクト タイプLongは自動生成されます。ドキュメントを参照してください。

于 2012-08-14T07:22:38.807 に答える