Jersey框架常用注解2:@Path和@PathParam注解

什么是资源(Resource)

所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的标识符。

应用,资源和子资源

一个完整的资源访问路径(URI)由以下部分构成
<协议>://<主机地址>:<端口>/应用域/<资源路径>/<子资源路径>
如系统应用中获取用户详细信息的URI可表示为
http://192.169.1.10:8080/system/user/1000001
协议:常用的协议有http、https、ws

主机地址:IP地址或域名
端口:服务端口
应用域:应用中根据业务属性划定的访问范围,如/system代表系统业务域,/product代表产品业务域
资源路径:包含所有子资源的路径
子资源路径:具体的资源访问地址

Jersey中应用域在服务器的启动类中,通过ServletContextHandler提供的setContextPath方法指定。

ServletContextHandler apiContext = new ServletContextHandler(
                ServletContextHandler.SESSIONS);
apiContext.addServlet(sh, "/*");
//指定应用域
apiContext.setContextPath("/system");

@Path注解

@Path注解的源码如下,可以看到该注解可以标记在类上,也可以标记在方法上,接收一个value参数,标识资源的地址。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Path {
    String value();
}

@Path使用举例

@Path("")
@WebService
public class WelcomeRes {
    @Path("")
    @GET
    public String sayHello(@Context HttpServletRequest request) {
        return "hello, jetty!";
    }
}
根资源类(Root Resource Classes)

在JAX-RS标准中,根资源类是带有@PATH 注解的类,且包含至少一个@Path 注解的方法或者方法带有 @GET、@PUT、@POST、 @DELETE 资源方法指示器的 POJO。

资源方法(Resource Method)

资源方法是带有资源方法指示器(resource method designator)注解的方法,在Jersey中,资源方法指示器即@GET、@HEAD、@PUT、@POST、 @DELETE。

关于@Path注解的理解

@Path("")相当于@Path("/"),即使注解的value中不显示指定"/",框架会自动加上。

如以下示例中路径注解加"/"和不加,最后的访问地址都为/user

  • @Path的内容是否以”/”开头都没有区别
  • 是否以”/”结尾也没有什么区别
//相当于@Path("user")
@Path("/user")
public class UserRes {
    //创建用户
    @PUT
    //相当于@Path("/")
    @Path("")
    public String add(String params) {
        return "";
    }
}

一个类被Jersey框架注册为资源的前提条件是,类必须具有@Path注解。如果没有被@Path注解修饰,访问时会产生Not Found错误。

如以下示例中,虽然方法被@Path注解修饰,但类没有被@Path修饰,不能被框架正确注册。

public class UserRes {
    //创建用户
    @PUT
    @Path("")
    public String add(String params) {
        return "";
    }
}

@Path默认值为空,如果是类,紧跟应用域路径,如果是方法,紧接着类代表的资源路径

如以下示例,访问时地址的地址应为http://<ip>:<port>/<应用域>/user/100001

@Path("/user")
public class UserRes {    
    @GET    
    @Path("/100001")
    public String add(String params) {
        return "";
    }
}

所有资源中,只能有一个类被标记为@Path("")或@Path("/"),否则在发起请求时会产生错误。

举例

@Path("/")
public class UserRes {    
    @GET    
    @Path("/100001")
    public String add(String params) {
        return "";
    }
}
@Path("")
public class ProductRes {    
    @GET    
    @Path("/100002")
    public String add(String params) {
        return "";
    }
}

如果有两个类同时被标记为@Path(""),则在发起HTTP访问时会产生以下错误。

org.glassfish.jersey.server.model.ModelValidationException: 
    Validation of the application resource model has failed during application initialization.
These two methods produces and consumes exactly the same mime-types and therefore their invocation as a resource methods will always fail.; source='org.glassfish.jersey.server.model.RuntimeResource@75ee966d']

在同一个类中,HTTP请求方法注解和资源地址注解相结合唯一确定一个资源的定位。
(1)资源地址相同,但是HTTP请求方法不同的两个方法是完全两个不同的REST接口。
(2)一个类中,@Path注解和HTTP请求方法注解的组合不能重复,否则会发生路径匹配错误,跟Java方法本省的名称无关。

以下类中,虽然方法的名称不同,但因为@Path和@Get组合冲突,故也会出错。

//错误示范
@Path("/product")
public class ProductRes {

    @Path("")
    @GET
    public String get() {
        return "";
    }

    @Path("")
    @GET
    public String getAll() {
        return "";
    }
    
}

错误如下:

org.glassfish.jersey.server.model.ModelValidationException: 
    Validation of the application resource model has failed during application initialization.
These two methods produces and consumes exactly the same mime-types and therefore their invocation as a resource methods will always fail.; source='org.glassfish.jersey.server.model.RuntimeResource@75ee966d']

@PathParam注解

该注解定义路径的参数信息,用于指定的URI路径参数,@PathParam 用在接收请求的方法的参数上。

    @GET
    @Path("/user/{username}")
    public String getUser(@PathParam("username") String userName) {
        return "hello," + userName;
    }

@PathParam注解提供更精确的匹配方式,如要求变量只能由字母和数字构成,则可以使用表达式覆盖默认的表达式[^/]+?
@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Jersey是一个开源的Java框架,用于构建RESTful Web服务。它是JAX-RS(Java API for RESTful Web Services)规范的参考实现之一。Jersey提供了一组注解,用于简化开发者构建RESTful服务的过程。 以下是Jersey框架中常用的注解: 1. @Path:用于标识资源类或方法的路径。可以在类级别和方法级别使用。例如,@Path("/users")表示该资源类或方法的路径为"/users"。 2. @GET、@POST、@PUT、@DELETE:用于指定HTTP请求方法。这些注解可以与@Path注解一起使用,用于标识资源类或方法支持的HTTP请求方法。 3. @PathParam:用于从URL路径中提取参数值。例如,@Path("/users/{id}")和@PathParam("id")可以用于提取URL路径中的"id"参数值。 4. @QueryParam:用于从查询参数中提取参数值。例如,@GET @Path("/users")和@QueryParam("name")可以用于提取查询参数中的"name"参数值。 5. @Consumes:用于指定请求的MIME媒体类型。例如,@Consumes(MediaType.APPLICATION_JSON)表示该方法接受JSON格式的请求。 6. @Produces:用于指定响应的MIME媒体类型。例如,@Produces(MediaType.APPLICATION_JSON)表示该方法返回JSON格式的响应。 7. @RequestBody:用于将请求体中的数据绑定到方法参数。例如,@POST @Path("/users")和@RequestBody User user可以用于将请求体中的JSON数据绑定到User对象。 8. @ResponseBody:用于将方法返回值作为响应体。例如,@GET @Path("/users/{id}")和@ResponseBody User getUserById(@PathParam("id") int id)可以用于将User对象作为响应返回。 这些注解可以根据具体需求灵活组合使用,以构建符合RESTful风格的Web服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值