`
zzc1684
  • 浏览: 1222891 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JAX-RS入门 三 :细节

阅读更多

、若希望一个Java类能够处理REST请求,则这个类必须至少添加一个@Path("/")的annotation;对于方法,这个annotation是可选的,如果不添加,则继承类的定义。

 

、一个方法上只有添加了某个Http Method的annotation,例如@GET,才有资格处理请求。

 

、@Path里的值可以是一个复杂的表达式,例如@Path("{id}") ,其中 {id}表达式代码了一个模板参数;一个模板参数是一个定义在@Path里的通配符,它以 { 开始,中间是一堆字母和数字的混合串(不能包含 / 字符),以 } 结尾。又如: @Path("{firstName}-{lastName}") .

 

、@Path也支持正则表达式,例如: @Path("{id: \\d+}") ,其中 \\d+ 表示一个数字。格式为: A : B

 

、可以自定http method的annotation,具体参考已经有的实现,例如@GET的实现:

Java代码 复制代码 收藏代码
  1. @Target({ElementType.METHOD})   
  2. @Retention(RetentionPolicy.RUNTIME)   
  3. @HttpMethod(HttpMethod.GET)   
  4. public @interface GET {   
  5. }   

其中HttpMethod的实现为:

Java代码 复制代码 收藏代码
  1. @Target({ElementType.ANNOTATION_TYPE})   
  2. @Retention(RetentionPolicy.RUNTIME)   
  3. @Documented  
  4. public @interface HttpMethod {   
  5.        
  6.     /**  
  7.      * HTTP GET method  
  8.      */  
  9.     public static final String GET="GET";   
  10.     /**  
  11.      * HTTP POST method  
  12.      */  
  13.     public static final String POST="POST";    
  14.     /**  
  15.      * HTTP PUT method  
  16.      */  
  17.     public static final String PUT="PUT";   
  18.     /**  
  19.      * HTTP DELETE method  
  20.      */  
  21.     public static final String DELETE="DELETE";   
  22.     /**  
  23.      * HTTP HEAD method  
  24.      */  
  25.     public static final String HEAD="HEAD";   
  26.     /**  
  27.      * HTTP OPTIONS method  
  28.      */  
  29.     public static final String OPTIONS="OPTIONS";   
  30.        
  31.     /**  
  32.      * Specifies the name of a HTTP method. E.g. "GET".  
  33.      */  
  34.     String value();           
  35. }   

因此,可以如下自定义新的http 请求方法:

Java代码 复制代码 收藏代码
  1. @Target({ElementType.METHOD})   
  2. @Retention(RetentionPolicy.RUNTIME)   
  3. @HttpMethod("LOCK")   
  4. public @interface LOCK {   
  5. }   

 

注:请不要试图重写HttpMethod annotation。

 

、Path的优先级规则

  • 首先检查匹配的字符的个数,匹配的个数越多越优先
  • 其次检查内嵌的模板表达式的个数,个数越多越优先
  • 最后是非缺省模板表达式的个数;缺省模板即未定义正则表达式的模板

例如以下顺利:

Java代码 复制代码 收藏代码
  1. 1 /customers/{id}/{name}/address   
  2. 2 /customers/{id : .+}/address   
  3. 3 /customers/{id}/address   
  4. 4 /customers/{id : .+}  

如果以上匹配不能解决你的问题,那多半是因为你的设计过于复杂,需要重新审视。

 

、允许、保留和需要转意的字符

  • 所以有 a-z、A-Z、0-9 都被允许
  • 所有: _-!.~'()* 都被允许
  • 所有: ,;:$&+=?/[]@ 都是保留字符 (需要转意)
  • 所有其他字符需要用 % 进行转意;格式为 %HH (%加两个十六进制数)

注:如果Path中uri的表达式包含有需要转意的字符,JAX-RS会自动进行转意;否则会视之为已经进行了URL的encoding。

 

、Matrix Param

Matrix Param是一个嵌在URI字符串中的name-value对,例如:

http://example.cars.com/mercedes/e55;color=black/2006

 

Matrix Param用于修饰特定的片段,如上修饰e55片段;不同于Query Param,用于修饰整个URI资源。

Matrix Param不出现在@Path的表达式中,例如以上URI对应的@Path的表达式可能是:@Path("/e55/{year}")。

但是可以用@MatrixParam annotation来取得Matrix Param的值,例如:@MatrixParam("color")

 

、Subresource Locators 

Subresources Locators是指一个指定了@Path annotation,但未指定HttpMethod的annotation,例如@GET,的Java方法。这个方法返回一个含有JAX-RS annotation的REST Service对象,这个对象知道怎么去分发剩余的请求。

 

例如:

Java代码 复制代码 收藏代码
  1. @Path("/customers")   
  2. public class CustomerDatabaseResource {   
  3.                @Path("{database}-db")   
  4.          public CustomerResource getDatabase(@PathParam("database") String db) {   
  5.                    // find the instance based on the db parameter   
  6.                    CustomerResource resource = locateCustomerResource(db);   
  7.                    return resource;   
  8.           }   
  9.           protected CustomerResource locateCustomerResource(String db) {   
  10.                     ...   
  11.          }   
  12. }   

其中CustomerResource可能是:

 

Java代码 复制代码 收藏代码
  1. public class CustomerResource {   
  2.     private Map<Integer, Customer> customerDB =   
  3.         new ConcurrentHashMap<Integer, Customer>();   
  4.     private AtomicInteger idCounter = new AtomicInteger();   
  5.     @POST  
  6.     @Consumes("application/xml")   
  7.     public Response createCustomer(InputStream is) {   
  8.         ...   
  9.     }   
  10.     @GET  
  11.     @Path("{id}")   
  12.     @Produces("application/xml")   
  13.     public StreamingOutput getCustomer(@PathParam("id"int id) {   
  14.         ...   
  15.     }   
  16.     @PUT  
  17.     @Path("{id}")   
  18.     @Consumes("application/xml")   
  19.     public void updateCustomer(@PathParam("id"int id, InputStream is) {   
  20.         ...   
  21.     }   
  22. }  

因为CustomerResource 并不打算做一个Service暴露,所以在类上没有添加@Path的annotation。

 

、完全动态分发

 

所谓完全分发,就是实现类可以是任意类,例如上面的CustomerDatabaseResource的getDatabase()方法的实现可以改为:

Java代码 复制代码 收藏代码
  1. @Path("/customers")   
  2. public class CustomerDatabaseResource {   
  3.      protected CustomerResource europe = new CustomerResource();   
  4.      protected FirstLastCustomerResource northamerica =   
  5.                                    new FirstLastCustomerResource();   
  6.   
  7.      @Path("{database}-db")   
  8.      public Object getDatabase(@PathParam("database") String db) {   
  9.            if (db.equals("europe")) {   
  10.                 return europe;   
  11.            }   
  12.             else if (db.equals("northamerica")) {   
  13.                 return northamerica;   
  14.             }   
  15.              else return null;   
  16.        }   
  17. }   

 

这里返回值是一个Object,已经不再局限于CustomerResource类了。JAX-RS会检查这个实例,以决定怎么分发请求。

分享到:
评论

相关推荐

    WebService视频教程大全

    2. **JAX-RS**: JAX-RS是处理RESTful服务的Java标准。CXF提供了对JAX-RS的强大支持,允许开发者使用注解来快速创建资源类,定义HTTP方法和URL映射,从而构建RESTful服务。 【WebService视频教程内容预览】 在...

    WebService技术手册 CXF&XFire

    - **JAX-WS与JAX-RS实现**:CXF提供了JAX-WS的完全实现,用于创建SOAP服务;同时,它也是JAX-RS规范的重要实现者,支持RESTful服务开发。 - **数据绑定**:CXF支持多种数据绑定技术,如JAXB(Java Architecture ...

    CXF入门教程及源码

    CXF是基于Apache基金会的项目,它提供了SOAP、RESTful、JAX-RS、JAX-WS等接口的支持,可以方便地创建Web服务。CXF的核心功能包括服务建模、绑定生成、服务实现和部署,以及客户端代理和服务代理的生成。它的设计...

    Apache CXF Web Service Development

    - **使用JAX-RS规范**:CXF支持JAX-RS 2.0规范,这使得开发者可以使用注解来轻松地创建RESTful服务。 - **资源路径和请求映射**:通过注解如`@Path`、`@GET`等来指定资源路径和HTTP方法。 ##### 4. **部署与配置** ...

    Web服务架构及其规范入门.

    JAX-WS提供了从Java接口到SOAP消息的自动绑定,使得开发人员可以更专注于业务逻辑,而不是底层的消息交换细节。 另一个重要的Java Web服务框架是Java EE中的Java API for RESTful Web Services (JAX-RS),它遵循...

    REST_资源指南_restful.pdf

    5. **REST工具推荐**:推荐了一些成熟的工具和框架,如Jersey项目及JAX-RS标准,以及WADL(Web Application Description Language,Web应用描述语言)等。 #### 五、Jersey项目与JAX-RS标准 - **JAX-RS**(Java API...

    seam 2.1 参考手册

    - **JAX-RS集成**:Seam 2.1集成了JAX-RS (JSR-311),这是RESTful Web服务的Java标准之一。这意味着开发者可以直接利用这些标准来构建RESTful应用。 - **RESTeasy集成**:RESTeasy是由JBoss成员Bill Burke开发的一个...

    apache-cxf-2.5.9

    2. **RESTful服务支持**:除了SOAP,CXF也支持基于HTTP协议的RESTful服务,使得开发人员可以利用JAX-RS(Java API for RESTful Web Services)标准来创建RESTful API。 3. **数据绑定**:CXF包含了对JAXB(Java ...

    RESTEasy 入门实例

    &lt;artifactId&gt;resteasy-jaxrs 版本号 &lt;groupId&gt;org.jboss.resteasy &lt;artifactId&gt;resteasy-client 版本号 ``` 然后,创建一个简单的 Java 类,实现 RESTful 接口。例如,我们可以创建一个名为 `...

    CAMEL核心开发指南

    - **Apache CXF**:这是一个智能的Web服务套件,支持JAX-WS和JAX-RS标准。 - **Apache Karaf**:这是一个小型的基于OSGi的运行时环境,允许部署应用程序。 - **Apache MINA**:这是一个高性能的、基于NIO的网络...

    WebService_CXF范例.

    在支持的标准方面,CXF涵盖了JAX-WS、JSR-181、SAAJ、JAX-RS等,以及各种SOAP版本和WSDL规范。同时,它支持多种数据绑定机制,如JAXB 2.x、Aegis、XMLBeans和SDO,并能处理XML、JSON、FastInfoset等多种数据格式。在...

    Web Service修炼之一XFire入门3

    1. **定义服务接口**:使用Java接口来定义Web服务的契约,可以使用JAX-RS或JAX-WS的注解来标注方法。 2. **实现服务接口**:创建接口的实现类,业务逻辑在此处编写。 3. **配置服务**:可以通过XML配置文件或注解来...

    quarkus:Quarkus示例列表

    Quarkus通过集成各种Java生态系统中的流行库,如JAX-RS(Java API for RESTful Web Services)和Quarkus Reactor,来实现这一目标。 标题“Quarkus示例列表”表明我们将探讨一系列使用Quarkus构建的应用示例,这些...

    JAVA EE 5 开发指南的代码

    6. **Web服务支持**:Java EE 5也包含了对SOAP和RESTful Web服务的支持,通过JAX-WS和JAX-RS,开发者可以轻松地创建和消费Web服务,实现不同系统间的互操作性。 7. **容器管理**:Java EE 5提供了强大的容器,如...

    The Java EE 5Tutorial

    6. **Web服务**:Java EE 5支持SOAP和RESTful Web服务,通过JAX-WS和JAX-RS规范,使得开发人员可以轻松地创建和消费Web服务。 7. **Java Message Service (JMS)**:JMS是Java EE的一部分,用于异步通信和消息传递。...

    Beginning JAVA EE 7经典

    本书《Beginning JAVA EE 7经典》是一本专注于Java EE(Java Platform, Enterprise Edition)7规范的入门到高级技术指导书籍,涵盖了Java EE核心技术如JSF(JavaServer Faces)、CDI(Contexts and Dependency ...

    jOOQ-manual-3.10.pdf

    除此之外,手册中还提到了jOOQ与多种现代开发工具和框架的集成,如现代集成开发环境(IDEs)、Spring、Apache DBCP、Flyway、JAX-RS等,以及如何在这些环境中高效使用jOOQ。同时,手册也讨论了jOOQ与Java 8、JavaFX...

    restful WebService的入门例子.pdf

    CXF是一个开源的服务框架,它提供了多种方式来创建Web服务,包括基于JAX-RS(Java API for RESTful Web Services)的标准方法。在CXF中,我们可以使用`@Path`、`@GET`、`@POST`等注解来定义服务端点和HTTP操作。例如...

    OpenFeign学习讲义大全.pdf

    Feign支持多种注解,包括它自身的Feign注解和JAX-RS注解,同时Spring Cloud还为其添加了对Spring MVC注解的支持,使得与Spring生态的集成更为紧密。 在使用OpenFeign之前,通常我们会用到Ribbon来实现客户端负载...

Global site tag (gtag.js) - Google Analytics