春天& Reslet:是否可以将URL路径组件映射到方法参数?

时间:2015-02-01 20:22:52

标签: restlet

我是Restlet的新手,但我已经关注了Restlet自己的网站上的教程,并启动并运行了一个基本的应用程序。我现在正在做的是,我正在设置基本ServerResource并公开@Get方法。

我想要的是能够调用/ user / {userId}并获取用户表示。是否有可能以某种方式将{userId}的映射移交给Restlet,而Restlet又会调用getUser(String userId)中的ServerResource

1 个答案:

答案 0 :(得分:2)

在框架中本身不支持这种特征(将路径变量绑定到带注释的方法参数中)。仅在输入表示中支持带注释的方法签名中的这种映射。

要获取请求的路径变量,您可以从请求对象(方法getAttribute)获取它们,如下所述:

public class UserServerResource extends ServerResource {
    @Get
    public User getUser() {
        String userId = getAttribute("userId");
        User user = (...)
        (...)
        return user;
    }
}

如果要跨多个方法共享此路径变量,可以将其定义为实例变量(请注意,为每个请求创建服务器资源的新实例,这与Spring REST不同,其中每个控制器都是单例等等变量必须在方法签名中定义)。我们可以利用服务器资源的方法doInit,如下所述:

public class UserServerResource extends ServerResource {
    private String userId;
    private User user;

    @Override
    protected void doInit() throws ResourceException {
        super.doInit();
        userId = getAttribute("userId");
        // for example
        user = loadUser(userId);
        // throws a status 404 if user can't be found
        setExisting(user != null);
    }

    @Get
    public User getUser() {
        return user;
    }

    @Put
    public User saveUser(User user) {
        saveUser(user);
        return user;
    }

    @Delete
    public void deleteUser() {
        deleteUser(user);
    }
}

如果您确实想要使用从请求元素(如路径变量,...)到方法参数的映射,则应使用JAXRS。 Restlet提供了对此规范的支持。使用JAXRS实现与上面类似的服务器资源如下所述:

@Path("/users/{userId}")
public class UserResource {
    @GET
    @Produces("text/xml")
    public String getUser(@PathParam("userId") String userId) {
        (...)
    }
}

有关详细信息,请查看相应的文档:http://restlet.com/technical-resources/restlet-framework/guide/2.2/extensions/jaxrs

跳起来有帮助, 亨利