在JAX RS中排序REST端点

时间:2015-11-20 13:36:51

标签: java rest jax-rs wildfly-8

我有两个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调用第一个方法。

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

3 个答案:

答案 0 :(得分:3)

您需要使用RegEx模式到您的@Path,按ID删除员工。例如,如果您的员工ID始终是一个数字,您可以尝试类似:

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

因为'所有'不是数字,第二个Rest模式将被调用。

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

答案 1 :(得分:2)

  • 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();
  }
}

答案 2 :(得分:0)

当JAX-RS命令端点时,它们很少有规则

  1. 首先,它按文字数量排序所有方法(所以你的相同,路径表达式不算数)
  2. 然后按模板表达式的数量再次排序,但按降序排列,因此/{emdId}/data/优先于/all/data