Java 在我的服务器端有许多@Get的Restlet

Java 在我的服务器端有许多@Get的Restlet,java,google-app-engine,restlet,objectify,Java,Google App Engine,Restlet,Objectify,所以我对restlet是新手。我正在创建一个可以与GAE服务器(使用objectify DB)通信的Android应用程序 我做了这个非常好的教程来学习: 它工作得很好,但做得很少。 有两种方法: public interface UserControllerInterface { @Put void create(User user); @Get Container getAllUsers(); } 对于我的应用程序,它更复杂,因此我添加了更多的方法: public interface U

所以我对restlet是新手。我正在创建一个可以与GAE服务器(使用objectify DB)通信的Android应用程序 我做了这个非常好的教程来学习:

它工作得很好,但做得很少。 有两种方法:

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);
}
它使用了错误的方法(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;
}
public List getAllMessage(){
//debug(“获取所有Obagoo消息”);
List msg=new ArrayList();
Objectify of y=ObjectifyService.begin();
Query q=ofy.Query(ObagooMessage.class);
对于(u:q){
添加味精(u);
}
返回味精;
}

错误提示:您正在创建一个Id为零的密钥


我的问题是您的
ObagoMessage
Id字段是
long
?您应该使其
。原语
long
Id值不是自动生成的,而对象类型
long
是自动生成的。请参阅。

在我所看到的示例中,它始终显示您应该将处理列表资源的
URI的
控制器
/
资源
与单个项(
id
/
基于名称的)资源分开。所以你会有这样的想法:

router.attach("/users", UsersController.class);
router.attach("/users/{id}", UserController.class
router.attach("/messages", MessagesController.class);
注意第一个类的复数命名:
userscoontroller
,第二个类的单数命名:
UserController
。第一个类将处理没有提供id的情况,例如获取所有用户。另外,请注意,当在
URI
中提供id时,它可以自动映射到类上的id字段中。因此,
Get
方法在方法调用中没有参数

对于处理子集,然后对于来自特定用户的消息,可以使用查询参数进行处理。例如,当使用
/messages?sender=id
通过
URI
调用时,
messagescoontroller.class
将在处理Get的方法中使用以下内容:

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

希望有帮助。我不是专家,所以任何人都可以随意纠正我。

我不想对我的id使用long,但问题是,当我调用getAllMessage()时,它为什么要创建消息??我可以放一个长的id,但我想有些事情我不明白。。。在我的getAllMessage()中,代码非常简单,只是一个查找。没有创造。为什么代码会进入我从未调用过的方法?是的,我在问题中有过它。我做了更多的测试:我在每个方法中放了一个日志,并注释所有其他代码。它没有调用正确的方法。我想知道restlet是否有可能在同一个控制器类中有许多带有@Get的方法…我还发现了这篇文章:stackoverflow.com/questions/7608694/…我真的想知道如果我必须将方法的名称放在URI中,如果我需要为每个Get方法都有一个控制器类,restlet是否有用。。。我已经习惯春天了,这让我很不安。。。或者我可能误解了什么……很明显,这更多的是关于正确的web API设计(REST)的问题。您应该尝试定义比当前更多的资源,这样您就不需要为同一资源使用多个GET/PUT方法,这通常是出现问题的迹象。您可以发布路由器的代码吗?那么,对于每种不同的方法,您会使用什么url呢?您将使用哪个url来
getAllUser
(顺便说一下,应该是复数。)
Form queryParams = getRequest().getResourceRef().getQueryAsForm(); 
String id = queryParams.getFirstValue("sender");