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

Spring & Reslet : is it possible to map a URL path component to a method argument?

我是 Restlet 的新手,但我已经按照 Restlet 自己网站上的教程进行操作并获得了一个基本的应用程序 运行。我现在正在做的是设置一个基本的 ServerResource 并公开一个 @Get 方法。

我想要的是能够调用 /user/{userId} 并取回用户表示。是否有可能以某种方式将 {userId} 的映射移交给 Restlet,后者又会在我的 ServerResource?

中调用 getUser(String userId)

框架本身不支持此类功能(将路径变量绑定到带注释的方法参数中)。带注释的方法签名中的此类映射仅受输入表示支持。

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

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

如果你想在多个方法之间共享这个路径变量,你可以将它定义为一个实例变量(注意,服务器资源的一个新实例是为每个请求创建的,这与 Spring REST 不同controller 是一个单例,这样的变量必须在方法签名中定义)。我们可以利用服务器资源的方法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

希望对您有所帮助, 蒂埃里