JAX-RS例外:在资源的GET注释,类不能被识别为有效资源的方法(JAX-RS exception

2019-07-20 08:35发布

我使用的JAX-RS web服务的球衣执行。 我是很新的这JAX-RS。

我试图在接受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;

}

请让我知道什么地方的问题,我在这是一个初学者,并努力理解这些概念:(

Answer 1:

JAX-RS不能自动转换@PathParam(它是一个字符串值),放入一个Employee对象。 可以从@PathParam自动创建的对象的要求是:

  1. 字符串(事实上的,因为数据已经是一个字符串)
  2. 与接受(单个)字符串作为参数的构造对象
  3. 与静态对象valueOf(String)方法

对于例2和3的对象会需要分析该字符串数据和填充其内部的状态。 这不是正常进行(因为它迫使你做出假设有关内容类型的数据)。 对于你的情况(刚开始学习JAX-RS),其最好只接受传入@PathParam数据作为一个String(或整数,或长)。

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


Answer 2:

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



Answer 3:

这是要序列化的实体(员工)到URL路径段很奇怪。 我不是说这是不可能的,但奇怪的,然后你必须确保该Employee类满足以下条件(这是从的javadoc的 @PathParam

类型注释参数,字段或属性必须要么的:
...(不相关的部分)
必须能够接受一个字符串参数的构造函数。
有一个名为的valueOf或fromString静态方法接受单个字符串参数(参见,例如,Integer.valueOf(字符串))。

你可能想通过Employee在请求主体raher对象不是在路径PARAM。 为了chieve此,注释Employee带班@XmlRootElement ,取出@PathParam从方法的注释empDetails说法,并改变@GET到@POST。



文章来源: JAX-RS exception: Annotated with GET of resource, class is not recognized as valid resource method