2013-02-22 33 views
2

我正在爲Web服務使用JAX-RS的球衣實現。我對這個JAX-RS非常陌生。JAX-RS異常:使用資源的GET註釋,類不被識別爲有效的資源方法

我想在接受Employee對象的服務中添加一個方法,並根據Employee對象的值返回僱員Id(這裏有一個DB命中)。

繼寧靜的原則,我做的方法,@GET,如圖所示下面提供的網址路徑:

@Path("/EmployeeDetails") 
public class EmployeeService { 
@GET 
@Path("/emp/{param}") 
public Response getEmpDetails(@PathParam("param") Employee empDetails) { 

    //Get the employee details, get the db values and return the Employee Id. 

    return Response.status(200).entity("returnEmployeeId").build(); 

} 
} 

出於測試目的,我寫了這個客戶端:

public class ServiceClient { 

public static void main(String[] args) { 

    ClientConfig config = new DefaultClientConfig(); 
    Client client = Client.create(config); 
    WebResource service = client.resource(getBaseURI()); 

    Employee emp = new Employee(); 
    emp.name = "Junk Name"; 
    emp.age = "20"; 
    System.out.println(service.path("rest").path("emp/" + emp).accept(MediaType.TEXT_PLAIN).get(String.class)); 

} 

private static URI getBaseURI() { 
    return UriBuilder.fromUri("http://localhost:8045/AppName").build(); 
} 

}

當我運行它時,出現錯誤:Method, public javax.ws.rs.core.Response com.rest.EmployeeService.getEmpDetails(com.model.Employee), annotated with GET of resource, class com.rest.EmployeeService, is not recognized as valid resource method.

編輯:

型號:

package com.model; 

public class Employee { 

public String name; 
public String age; 

} 

請讓我知道什麼地方的問題,我在這是一個初學者,並努力理解這些概念:(

+0

你確定你不想傳遞'employeeId'並返回一個'Employee'對象。 – beny23 2013-02-22 12:41:03

+0

是的,我知道它不尋常的通過其他細節並獲得身份證,但多數民衆贊成的要求。如果有多個員工,則需要根據他們的加入日期提取最老的員工,因此我相信我需要傳遞員工對象並獲取員工ID。您可以讓我知道如何使這項工作:( – WhoAmI 2013-02-22 12:45:44

+0

添加您的EmployeeService類的定義到問題,包括任何類級別的註釋 – Perception 2013-02-22 12:48:03

回答

5

JAX-RS不能自動將@PathParam(它是一個字符串值)轉換爲Employee對象。可以從@PathParam被自動創建的對象的要求是:

  1. 字符串(事實上的,由於數據已經是一個字符串)
  2. 對象使用構造,接受一個(單個)的字符串作爲參數
  3. 使用靜態 valueOf(String)方法

對於箱子2 & 3對象

  • 對象將需要分析該字符串數據和填充其內部的狀態。這通常不會完成(因爲它迫使您對數據的內容類型進行假設)。對於您的情況(剛開始學習JAX-RS),最好只接受傳入的@PathParam數據作爲字符串(或整數或長整數)。

    @GET 
    @Path("/emp/{id}") 
    public Response getEmpDetails(@PathParam("id") String empId) { 
        return Response.status(200).entity(empId).build(); 
    } 
    

    在GET方法傳遞一個複雜的對象表示來REST服務沒有多大意義,除非其被使用,例如,作爲搜索過濾器。根據你的反饋,這就是你想要做的。實際上我已經在一個項目上完成了這項工作(搜索過濾器的通用實現),但有一點需要注意,您需要嚴格定義搜索數據的格式。因此,讓我們將JSON定義爲可接受的格式(您可以根據需要將示例調整爲其他格式)。 '搜索對象'將作爲查詢參數filter傳遞給服務。

    @GET 
    @Path("/emp") 
    public Response getEmployees(@QueryParam("filter") String filter) { 
        // The filter needs to be converted to an Employee object. Use your 
        // favorite JSON library to convert. I will illustrate the conversion 
        // with Jackson, since it ships with Jersey 
        final Employee empTemplate = new ObjectMapper().readValue(filter, Employee.class); 
    
        // Do your database search, etc, etc 
        final String id = getMatchingId(empTemplate); 
    
        // return an appropriate response 
        return Response.status(200).entity(id).build(); 
    } 
    

    並在您的客戶端類:

    final String json = new ObjectMapper().writeValueAsString(emp); 
    service 
        .path("rest") 
        .path("emp") 
        .queryParam("filter", json) 
        .accept(emp, MediaType.TEXT_PLAIN) 
        .get(String.class) 
    
  • +0

    要求接收該員工的其他詳細信息,並返回它的ID – zagyi 2013-02-22 13:33:19

    +0

    Theres沒有簡單的方法來傳遞(複雜)對象表示形式作爲路徑參數。需要使用@PathParam,還是隻是將'Employee'數據傳遞到Web服務? – Perception 2013-02-22 13:39:34

    +0

    '@ Perception'它只是將員工信息傳遞給Web服務參數。我是新手,因此不知道使用@PathParam的其他選項。是否有其他選項比使用@PathParam要達到相同的目標嗎?謝謝你的幫助。 – WhoAmI 2013-02-22 13:45:16

    1

    這是相當奇怪的是,你要序列化的實體(員工)到URL路徑段。我不是說這是不可能的,但奇怪的,然後你必須確保該Employee類滿足以下條件(這是從javadoc of@PathParam

    The type of the annotated parameter, field or property must either:
    ... (irrelevant part)
    Have a constructor that accepts a single String argument.
    Have a static method named valueOf or fromString that accepts a single String argument (see, for example, Integer.valueOf(String)).

    你可能想通過Employee對象請求主體比在路徑參數中更加激烈。爲了解決這個問題,請使用@XmlRootElement註釋Employee類,從方法的empDetails參數中刪除@PathParam註釋,並將@GET更改爲@POST。

    +0

    是的,這就是要點。多數民衆贊成在我想如何通過URL中的員工對象沒有序列化,請耐心,因爲我是一個初學者,今天是我的第二天。如果我嘗試將請求放入請求並返回請求,那麼代碼將如何顯示?你可以請張貼相同的示例代碼嗎? – WhoAmI 2013-02-22 13:38:59

    +0

    你可以很容易找到很好的例子/教程,只是谷歌的「jax-rs教程」。使用它們會更容易,因爲您可能會遇到已在此處詳細解釋的問題。 – zagyi 2013-02-22 14:00:00

    +0

    感謝您的輸入。我試過這個鏈接:http://www.mkyong.com/webservices/jax-rs/download-xml-with-jersey-jaxb/「,他們接受一個字符串並返回與我相反的XML我正在努力實現。仍然無法找出你的建議:(你可以請張貼一些鏈接,我可以找到你所建議的?感謝您的幫助 – WhoAmI 2013-02-22 15:09:41

    2

    我得到了同樣的問題,但我只是修復它 在你的應用程序中使用的球衣罐應該有相同的版本。