2013-02-22 38 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

    我得到了同样的问题,但我只是修复它 在你的应用程序中使用的球衣罐应该有相同的版本。