首頁 >Java >java教程 >Java Jersey2使用總結

Java Jersey2使用總結

高洛峰
高洛峰原創
2016-12-17 14:47:321544瀏覽

簡介

Jersey是JAX-RS(JSR311)開源參考實作用於建構    RESTful    Web service,它包含三個部分: 

核心伺服器(Core Server)可以使用SR   用直覺的方式開發RESTful Web服務。     

核心客戶端(Core Client)         :Jersey客戶API能夠幫助開發者與RESTful服務輕鬆通訊;     Abdera的庫。     

在本次開發中使用Jersey2.0,並且只使用了核心伺服器。

設定Jersey環境

Maven

 org.glassfish.jersey.containers  jersey-container-servlet-containact-let version>2.0  javax.xml.ws  jaxws-api  2.1  org.codehaus.jackson  jackson-core-asl  1.9.12  org.codehaus.jackson  jackson-mapper-asl  1.9.12  org.codehaus.jackson  jackson-jaxrs  1.9.12


引入Jar檔案方式

中將以下程式庫複製的WEB-INF下的庫目錄:

伺服器:jersey-server.jar 、jersey-Container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api- 2.0.jar

客戶端:jersey-client.jar

common:jersey-common.jar

        json支持:在Jersey2.0中需要使用        Jackson1.9         才能支持json。

Hello World

以下將展示一個Hello World

第一步:    編寫一個名為HelloResource的資源,它接受Http Get請求並回應「Hello Jersey」 

@Path(public/class HReello") public/class HReello@Path(public"/class HReello {  @GET  @Produces(MediaType.TEXT_PLAIN)  public String sayHello() {    return "Hello Jersey";  }

}



第二步:  

   public APIApplication() {  //載入Resource  register(HelloResource.class);  //註冊資料轉換器 register(JacksonJsonProvider.class);  // Logging.  register(LoggingFilter.class);

   }🠎 xml檔案中定義servelt調度程序,目的是將所有REST請求傳送到Jersey容器。除了宣告Jersey Servlet外,還需定義一個初始化參數,指定JAX-RS application。

 JerseyServlet  org.glassfish.jersey.servlet.ServletContainer      javax.ws.rs.Application    cn.com.mink.resource.APIApplication   1  JerseyServlet  /services/*pattern>


第四步:    測試程式 

在命令終端機中輸入以下命令,將會看到「Hello Jersey」。

curl      http://host:port/services/hello    

或瀏覽器中輸入下列何/hello    

使用

資源

Root Resource And Sub-Resource

資源是組成RESTful服務的關鍵部分,可使用HTTP方法(如:GET、TLEST、PUT、DETLE、PUT、DETLEST)操作資源。在JAX-RX中,資源透過POJO實現,使用    @Path     註釋來組成其識別碼。資源可以有子資源,父資源是資源集合,子資源是成員資源。

在以下範例程式碼中,

Resources是"/services" URI組成是集合資源,UserResource是「/services/user」 URI組成的成員資源;

@Path("/services")public class Resources {  @Path("/user")  public UserResource getUserResource() {    ...  }  @Path("/book")  public BookResource getBookResource() {    ...  }

}

)

?的集合資源,getUser是「/user/{username}」 URI組成的資源方法


@Path("/user")public class UserResource {  @GET  @Path("{username"})  @Produces("application/ json")  public User getUser(@PathParam("username") String userName) {    ...  }
}

HTTP Methods


HTTP方法對應到資源的CRUD(建立、讀取、更新)操作,基本模式如下:

HTTP      GET       :讀取/列出/擷取單一或資源集合。   

HTTP      POST       :新資源。   

HTTP      PUT       :可更新現有資源或資源集合。   

HTTP      DELETE       :已移除資源或資源集合。   

@Produces

@Produces     註解用來指定將要傳回給client端的資料識別類型(MIME)。    @Produces     可作為class註釋,也可作為方法註釋,方法的    @Produces     註釋將會覆寫class的註釋。

指定一個MIME型別

@Produces("application/json")

指定多個MIME型

}

@Produces({

@Consumes

@Consumes     與    @Produces     相反,以指定可接受的clientMI POST 。 

參數(Parameter Annotations)

Parameter Annotations用於取得client所傳送的資料。本文只介紹常用的註解,更多詳見    Jersey使用手冊  

@PathParam

使用    @PathParam     可以取得URI中指定規則的參數,例如: 以

@QueryParam

@QueryParam     用於取得GET請求中的查詢參數,如: 

@GET@Path("/user")@Produces("text/plain")public User getUser(@Query ") String name,                    @QueryParam("age") int age) {

   ...

}
Šo:505當瀏覽器請求瀏覽器請求值rose ,age值為25。如果需要為參數設定預設值,可以使用    @DefaultValue     ,如: 

@GET@Path("/user")@Produces("text/plain")public User getUser(@QueryParam("name") Stringname,"name") name, getUsername") @DefaultValue("26") @QueryParam("age") int age) {

   ...

}

當瀏覽器請求    http://host:port/user?name=rose   ,age值為26。 

@FormParam

@FormParam     ,顧名思義,從POST請求的表單參數取得資料。如: 

@POST@Consumes("application/x-www-form-urlencoded")public void post(@FormParam("name") String name) {    // Store the message}

@BeanParam

請求參數很多時,例如客戶端提交一個修改使用者的PUT請求,請求包含許多使用者資訊。這時可用    @BeanParam     。

@POST@Consumes("application/x-www-form-urlencoded")public void update(@BeanParam User user) {    // Store the user data}


User Bean定義如下:p = "user")

public class User {  @PathParam("userName)  private String userName;  @FormParam("name")  private String name;  @FormParam("telephone")  private String name;  @FormParam("telephone") private String private表String email;  public String getUserName() {    return userName;  }  public void setUserName(String userName) {    this.userName = userName;  }  ...

}




的一個大參數多變,參數結構的調整都會因為以上幾種方式而遇到問題,這時可以考慮使用    @Context     註釋,並獲得UriInfo實例,如下: 

@GET

public String get(@Context UriInfo ui) { MultivaluedMap queryParams = ui.getQueryParameters();

   MultivaluedMap pathParams = ui.getPathParameters();

text Config     、    ServletContext    、    HttpServletRequest    、   HttpServletResponse     、   HttpServletResponse    HttpHeaders     等,如下: 


@Path("/")public class Resource {  @Context  HttpServletRequest req;  @Context  ServletConfig. eaders hh) {    MultivaluedMap headerParams = hh.getRequestHeaders();    Map pathParams = hh.getCookies();  }
}


Jersey JavaBean綁定到XML或JSON,反之亦然。 JavaBean必須使用   @XmlRootElement     標註,且沒有    @XmlElement     註解的欄位將包含一個名稱與相同的XML元素,如下: 

@ffRoot/prim. vate String errorMsg; public String getResult() {    return result;   this.errorMsg = errorMsg;  }

}



然後在REST服務中使用:

@Path("/user")public class UserResource {  @POST  @Produces("application/json")  public OptionResult create(@userBam User }

}

最後,要註冊資料轉換器,該轉換器會自動將JavaBean轉換為json資料:

public class APIApplication extends ResourceConfig {

   public APIApplication(p. ;  //載入與OptionResult同一個packge的Model  //packages(OptionResult.class.getPackage().getName());  //載入Resource  register(UserResource.class);  //註冊資料轉換器 registerer(JackclassJsonProvidisterer. );  // Logging.  register(LoggingFilter.class);

   }

}



說明    :返回XML資料的原理相同,僅是資料轉換器不同,只需要在APIApplication詳見    Jersey使用手冊  

問題總結

Ajax請求(POST、PUT和DELETE)無法將資料提交至Jersey容器

問題闡述
問題闡述
問題闡述

    在簡訊平台的開發中,資料的CRUD全部使用Ajax技術完成,因此必須使用POST、PUT和DELETE請求。此三種請求的content-type都是“application/x-www-form-urlencoded”,使用UTF-8編碼會變成“application/x-www-form-urlencoded; UTF-8”。在使用Firefox的tamperdata擴展調試程序的過程中發現,當content-type為“application/x-www-form-urlencoded”時,Jersey容器能夠透過   @FormParam     註解取得提交的數據,而content-type則為「 application/x-www-form-urlencoded; UTF-8”時可取得不到。 

解決方案

最後我使用Java Filter和Jersey RequestFilter解決了問題。首先在Java Filter中使用UTF8將Request中的資料編碼,然後在Jersey RequestFilter中將request物件中的content-type修改為「application/x-www-form-urlencoded」。如:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  HttpServletRequest req = (HttpServletRequest)quest 8Im| ter implements ContainerRequestFilter {  @ Override  public void filter(ContainerRequestContext context) throws IOException {    String headerString = context.getHeaderString("content-type");    if (headerString != null) { 「開頭,則處理      if (headerString.startsWith(MediaType.APPLICATION_FORM_URLENCODED))        context.getHeaders().putSingle("content-type", MediaType.APPLICATION_FORM_UR ED在web.xml中註冊Java Filter(要註冊在Jersey容器之前),在APIApplication中註冊Jersey RequestFilter,如下:

public class APIApplication extends ResourceConfig {
   public APIApplication() {

說明         


:在修復此問題後,在Github的Jersey原始碼倉庫中看到已經有人發現並修復了此問題,在下個Jersey正式版本中應該不會再出現這樣的問題,詳見    此Discussion  



更多Java Jersey2使用總結相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn