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 订购端点时,很少有规则在起作用
- 首先,它根据文字的数量对所有方法进行排序(所以你是一样的,路径表达式在这里不算)
- 然后再次按模板表达式的数量排序,但按降序排列,因此
/{emdId}/data/
优先于 /all/data
。
我有两个 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 订购端点时,很少有规则在起作用
- 首先,它根据文字的数量对所有方法进行排序(所以你是一样的,路径表达式在这里不算)
- 然后再次按模板表达式的数量排序,但按降序排列,因此
/{emdId}/data/
优先于/all/data
。