JBoss.orgCommunity Documentation

第 5 章 @PathParam

5.1. @PathParam使用进阶和正则表达式
5.2. @PathParam 和 PathSegment

注意

RESTEasy @PathParam 注解支持不直接指定参数名

@PathParam 是一个参数注释,它允许您将变量 URI 路径片段映射到方法调用中。

@Path("/library")
public class Library {

   @GET
   @Path("/book/{isbn}")
   public String getBook(@PathParam("isbn") String id) {
      // search my database and get a string representation and return it
   }
}

这允许您在资源的 URIs 中嵌入变量标识。在上面的示例中,使用了一个 isbn URI 参数来传递有关我们想要访问的书的信息。注入的参数类型可以是任何基元类型、 String 或任何具有接受 String 参数的构造函数的任何 Java 对象,或者接受 String 作为参数的静态 valueOf 方法。例如,假设我们希望 isbn 是一个真正的对象。我们可以这样做:

@GET
@Path("/book/{isbn}")
public String getBook(@PathParam("isbn") ISBN id) {...}

public class ISBN {
   public ISBN(String str) {...}
}

或者不使用公共字符串构造函数,而使用 valueOf 方法:

public class ISBN {
    public static ISBN valueOf(String isbn) {...}
}

@PathParams 的一些更复杂的用法在前面的小节中没有讨论。

允许在一个 URI 段中指定一个或多个路径参数:

1. @Path("/aaa{param}bbb")
2. @Path("/{name}-{zip}")
3. @Path("/foo{name}-{zip}bar")

因此,"/aaa111bbb" 匹配 #1。"/bill-02115" 匹配 #2。"foobill-02115bar" 匹配 #3。

我们之前讨论过如何在 @Path 值中使用正则表达式模式。

@GET
@Path("/aaa{param:b+}/{many:.*}/stuff")
public String getIt(@PathParam("param") String bs, @PathParam("many") String many) {...}

对于以下请求,让我们看看 "param" 和 "many" @PathParams 的值是什么:


该规范有一个非常简单的抽象,用于检查在 javax.ws.rs.core.PathSegment 上调用的 URI 路径的片段:

public interface PathSegment {

    /**
     * Get the path segment.
     * <p>
     * @return the path segment
     */
    String getPath();
    
    /**
     * Get a map of the matrix parameters associated with the path segment
     * @return the map of matrix parameters
     */
    MultivaluedMap<String, String> getMatrixParameters();

}

你可以用 RESTEasy 注入一个 PathSegment,而不是用 @PathParam 注入一个值。

@GET
@Path("/book/{id}")
public String getBook(@PathParam("id") PathSegment id) {...}

如果你有一大堆使用矩阵参数的 @PathParams,这是非常有用的。矩阵参数的思想是,它们是嵌入在 uri 路径段中的任意一组名值对。PathSegment 对象提供对这些参数的访问。参见 MatrixParam。

一个矩阵参数的例子是:

GET http://host.com/library/book;name=EJB 3.0;author=Bill Burke

矩阵参数的基本思想是,它表示可通过其属性及其原始 id 寻址的资源。