当前位置: 首页 > 面试题库 >

JAX-RS异常:用资源的GET注释,该类未被识别为有效的资源方法

施德元
2023-03-14
问题内容

我正在将JAX-RS的jersey实现用于Web服务。我对这个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;

}

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


问题答案:

JAX-RS无法自动将@PathParam(它是一个字符串值)转换为Employee对象。可以从@PathParam自动创建的对象的要求是:

  1. 字符串(事实上,因为数据已经是字符串)
  2. 具有接受(单个)字符串作为参数的构造函数的对象
  3. 具有静态valueOf(String)方法的对象
    对于情况2和3,将需要该对象解析字符串数据并填充其内部状态。通常不会这样做(因为这会迫使您对数据的内容类型进行假设)。对于您的情况(刚开始学习JAX-RS),最好只接受传入的@PathParam数据作为String(或Integer或Long)。
@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)


 类似资料:
  • 问题内容: 我正在将JAX-RS的jersey实现用于Web服务。我对这个JAX-RS非常陌生。 我试图在服务中添加一个方法,该方法接受Employee对象并根据Employee对象的值返回雇员ID(为此有数据库命中)。 遵循Restful原则,我将方法设置为@GET并提供了url路径,如下所示: 出于测试目的,我编写了此客户端: } 运行它时,出现错误: 编辑: 模型: 请让我知道问题出在哪里,

  • 问题内容: 无法使用Jersey实现简单的文件上传。缺少应用程序引导时引发的依赖项错误: 将输入参数映射到REST服务似乎存在问题?我已经阅读了文档并遵循了几个示例,但是我并没有偏离这些示例。 这是代码: 我为FormDataParams输入了“ compile’c​​om.sun.jersey.contribs:jersey- multipart:1.17.1’”。 编辑 :我能够使它在泽西岛工

  • 本章呈现 JAX-RS 核心概念-资源和子资源的概述。 JAX-RS 2.0 的 JavaDoc 文档 可以在这里 找到。 JAX-RS 2.0 规范草案可以在这里 找到。

  • Root Resource Classes 是带有 @PATH 注解的,包含至少一个 @PATH 注解的方法或者方法带有 @GET、@PUT、 @POST、 @DELETE 资源方法指示器的 POJO。资源方法是带有资源方法指示器(resource method designator)注解的方法。这一节就是展示如何使用 Java 对象内的注解创建一个 Jersey 的 RESTful 服务。 下面

  • service.java: sqlDataProvider.java: 如果在Glassfish服务器中部署此servlet并执行请求,将引发以下异常: 亲切地问候帕斯卡

  • 问题内容: 我正在通过DropWizard 0.7.1使用Jersey / JAX-RS公开RESTful服务端点。我所有的实体POJO都用JAX- RS和Hibernate / JSR-303 bean验证注释进行了注释,如下所示: 当资源方法接收到这些POJO之一作为输入时(实际上,DropWizard已经将HTTP实体JSON反序列化为一个实例),我想根据Hibernate / Bean V