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。
希望对您有所帮助,
蒂埃里
我是 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。
希望对您有所帮助, 蒂埃里