0

所以我是restlet的新手。我正在创建一个可以与 GAE 服务器通信的 Android 应用程序(使用 objectify DB)我做了这个非常好的教程来学习: http ://www.tutos-android.com/webservice-rest-android-appengine-restlet-objectify

它工作得很好,但做的很少。只有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);
}

这些方法中的每一个都在服务器端工作(我用 Junit 测试过)。

现在我正在编写 android 部分,但我遇到了问题。当我对 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,第二类的单数命名: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 回答