3

我正在为 Web 服务使用 JAX-RS 的球衣实现。我对这个 JAX-RS 很陌生。

我正在尝试在服务中添加一个方法,该方法接受一个 Employee 对象并根据 Employee 对象值返回员工 ID(为此有一个数据库命中)。

遵循Restful原则,我将方法设为@GET,并提供如下所示的url路径:

@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;

}

请让我知道问题出在哪里,我是这方面的初学者,正在努力理解这些概念:(

4

3 回答 3

6

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)
于 2013-02-22T13:28:35.880 回答
3

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

于 2014-09-15T11:15:04.537 回答
1

您想将实体(Employee)序列化为url路径段,这很奇怪。我不是说不可能,而是说很奇怪,然后你必须确保Employee该类满足以下条件(来自javadoc 的 @PathParam

带注释的参数、字段或属性的类型必须:
...(无关部分)
具有接受单个字符串参数的构造函数。
有一个名为 valueOf 或 fromString 的静态方法,它接受单个 String 参数(例如,参见 Integer.valueOf(String))。

您可能希望Employee在请求正文中而不是在路径参数中传递对象。为此,请使用 注释Employee类,从方法的参数@XmlRootElement中删除注释,并将@GET 更改为@POST。@PathParamempDetails

于 2013-02-22T13:29:41.223 回答