JAX RS 中 REST 端点的排序

Ordering of REST end points in JAX RS

我有两个 REST 端点,一个用于删除所有员工的一些数据,另一个用于通过员工 ID 删除特定员工的数据。

这是两种方法:

@Path("/{empId}/data")
@DELETE
public Response deleteEmpDataa(@PathParam("empId") final String empId) { }

@Path("/all/data")
@DELETE
public Response deleteAllData(){}

现在,当我想删除所有员工数据并从 postman chrome 插件

进行查询时

http://localhost/rest/mymapping/all/data

我希望它调用第二种方法 deleteAllData。相反,它使用 PathParam all.

调用第一个方法

这是订购问题吗?我们如何解决这个问题?

您需要在您的@Path 中使用RegEx 模式来按ID 删除员工。例如,如果您的员工 ID 始终是数字,您可以尝试这样的操作:

@Path("/{empId:[0-9]*}/data")

由于'all'不是数字,第二个休息模式将被调用。

参见:@Path and regular expression (Jersey/REST)

  • all{empId} 的匹配值。
  • 您没有将 Employee 视为真正的 RESTful 资源(这不是一个好的做法)。

在您当前的实施中,您可以:

@Path("/employees/{empId}")
@DELETE
public Response deleteEmpDataa(@PathParam("empId") final String empId) { }

@Path("/employees")
@DELETE
public Response deleteAllData(){}

而且,通过更好的设计,您将拥有:

@Path("/employees/{empId}")
public EmployeeResource getEmployee(@PathParam("empId" final String empId) {
  Employee e = loadEmployee(empId);
  return new EmployeeResource(employee);
}

并删除所有员工:

@Path("/employees")
@DELETE
public Response deleteAllEmployees() {
  // Delete all employees
  return Response.status(204).build();
}

然后 EmployeeResource 将是:

@Provider
public class EmployeeResource {
  private final Employee e;

  @DELETE
  public Response delete() {
    // Delete Employee
    return Response.status(204).build();
  }
}

当 JAX-RS 订购端点时,很少有规则在起作用

  1. 首先,它根据文字的数量对所有方法进行排序(所以你是一样的,路径表达式在这里不算)
  2. 然后再次按模板表达式的数量排序,但按降序排列,因此 /{emdId}/data/ 优先于 /all/data